Почему левое и правое объединение игнорируют некоторые значения в запросе? - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть таблица с 3 столбцами и этими значениями:

col1   col2   col3
-------------------
  1      2      8
  1      3      5
  1     10     15
  2      4      6
  2      9      7
  3      5      6

Я присоединяюсь к запросу LEFT JOIN и RIGHT JOIN для запроса группирования и подсчета для каждого номера (MS-ACCESS).

SELECT Col1 AS Num, t1.CON1, t2.CON2, t3.CON3
        FROM
           (((SELECT col1, COUNT(col1) AS CON1 FROM table GROUP BY col1) AS t1
              LEFT JOIN (SELECT col2, COUNT(col2) AS CON2 FROM table GROUP BY col2) AS t2
                         ON t1.col1 = t2.col2)
              LEFT JOIN (SELECT col3, COUNT(col3) AS CON3 FROM table GROUP BY col3) AS t3
                         ON t2.col2 = t3.col3)
        UNION
        SELECT col3 AS Num, t1.CON1, t2.CON2, t3.CON3
        FROM
           (((SELECT col1, COUNT(col1) AS CON1 FROM table GROUP BY col1) AS t1
              RIGHT JOIN (SELECT col2, COUNT(col2) AS CON2 FROM table GROUP BY col2) AS t2
                          ON t1.col1 = t2.col2)
              RIGHT JOIN (SELECT col3, COUNT(col3) AS CON3 FROM table GROUP BY col3) AS t3
                          ON t2.col1 = t3.col3)

Это выглядит так:

Num  CON1  CON2  CON3
--------------------------
  1    3      
  2    2     1
  3    1     1
  5          1     1
  6                2
  7                1
  8                1
 15                1

Но этот запрос игнорирует количество значений из столбца 2 таблицы

Num    CON2
--------------- 
   4       1
   9       1
  10       1

Чего не хватает в моем запросе

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Это дает правильные итоги, но я не могу понять, как суммировать результаты (например, в списке 3 дважды) ...

(
        (SELECT col1 as num, COUNT(col1) AS CON1, null as CON2, null as CON3  FROM mytable t1
          LEFT JOIN (SELECT col2, COUNT(col2) AS CON2 FROM mytable GROUP BY col2)  t2
                     ON t1.col1 = t2.col2
          LEFT JOIN (SELECT col3, COUNT(col3) AS CON3 FROM mytable GROUP BY col3)  t3
                     ON t2.col2 = t3.col3
        GROUP BY t1.col1)

        UNION

       (SELECT col2 as num, null as CON1, COUNT(col2) AS CON2, null as CON3  FROM mytable t4
          left JOIN (SELECT col1, COUNT(col1) AS CON1 FROM mytable GROUP BY col1)  t5
                      ON t4.col2 = t5.col1
          left JOIN (SELECT col3, COUNT(col3) AS CON3 FROM mytable GROUP BY col3)  t6
                      ON t4.col2 = t6.col3

        GROUP BY t4.col2)

        UNION

         (SELECT col3 as num, null as CON1, null as CON2, COUNT(col3) AS CON3 FROM mytable t7
          left JOIN (SELECT col1, COUNT(col1) AS CON1 FROM mytable GROUP BY col1)  t8
                      ON t7.col3 = t8.col1
          left JOIN (SELECT col2, COUNT(col2) AS CON3 FROM mytable GROUP BY col2)  t9
                      ON t7.col3 = t9.col2

        GROUP BY t7.col3)
        )

РЕЗУЛЬТАТЫ:

num     CON1    CON2    CON3
1        3      
2                1  
2        2      
3                1  
3        1  
4                1
5                        1
5                1  
6                        2
7                        1
8                        1
9                1  
10               1  
15                       1

... Кто-нибудь?

SQL ТЕСТ: https://sqltest.net/#979886

0 голосов
/ 04 апреля 2020

Если вы хотите посчитать каждое значение и количество раз в каждом столбце, используйте union all для разделения данных, а затем group by:

select num, sum(col1), sum(col2), sum(col3)
from ((select col1 as num, 1 as col1, 0 as col2, 0 as col3
       from t
      ) union all
      (select col2 as num, 0 as col1, 1 as col2, 0 as col3
       from t
      ) union all
      (select col3 as num, 0 as col1, 0 as col2, 1 as col3
       from t
      )
     ) as x
group by num
order by num;
...