Подсчет пропущенных значений в SQL объединении - PullRequest
0 голосов
/ 09 апреля 2020

Не могли бы вы посоветовать правильный запрос для подсчета, включая категории без данных?

Table1

|ID | NAME
+---+------
| 1 | AAA
| 2 | BBB
| 3 | CCC
| 4 | DDD 

Table2

GroupName | GUID | ID
----------+------+-----
 GroupA   | zxcv |  1
 GroupA   | zxdt |  1
 GroupA   | fhgg |  2
 GroupA   | fhjg |  2
 GroupA   | fqwe |  2
 GroupB   | ffgh |  3
 GroupB   | yjkl |  3
 GroupB   | poiu |  2
 GroupB   | mnju |  2
 GroupB   | gytd |  2

Я пытаюсь do

SELECT 
    B.GroupName,
    A.NAME,
    COUNT(DISTINCT B.GUID) Quantity
FROM
    Table2 B
LEFT JOIN 
    Table1 A ON B.ID = A.ID
GROUP BY 
    B.GroupName, A.NAME

В результате я получаю

GroupA | AAA | 2
GroupA | BBB | 3
GroupB | CCC | 2
GroupB | BBB | 3

Но я хочу видеть

GroupA | AAA | 2
GroupA | BBB | 3
GroupA | CCC | 0
GroupA | DDD | 0
GroupB | AAA | 0
GroupB | BBB | 3
GroupB | CCC | 2
GroupB | DDD | 0

Любая помощь приветствуется ...

1 Ответ

1 голос
/ 09 апреля 2020

Вы должны скрестить соединение Table1 со всеми различными именами групп в Table2, а затем оставить соединение с Table2 для агрегирования:

select d2.groupname, t1.name, count(t2.id) counter
from table1 t1 cross join (select distinct groupname from table2) d2
left join table2 t2
on t2.groupname = d2.groupname and t2.id = t1.id
group by d2.groupname, t1.name
order by d2.groupname, t1.name

См. Демонстрационную версию . Результаты

> groupname | name | counter
> :-------- | :--- | ---------------:
> GroupA    | AAA  |                2
> GroupA    | BBB  |                3
> GroupA    | CCC  |                0
> GroupA    | DDD  |                0
> GroupB    | AAA  |                0
> GroupB    | BBB  |                3
> GroupB    | CCC  |                2
> GroupB    | DDD  |                0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...