Проблема с SQL Group By и COALESCE на sqlite - PullRequest
1 голос
/ 13 февраля 2020

У меня есть таблица, как показано ниже в базе данных sqlite. Я хочу создать линейную диаграмму, показывающую использование по группам продуктов.

Table: ProductUsageData

UserID  ProductName ProductGroup    Qty RecordID
1       A1          A               12  1   
2       A1          A               12  1   
1       A2          A               15  1   
3       A1          A               12  2   
2       B1          B               12  2   
5       B2          B               5   2
1       A1          A               12  3   
1       A2          A               15  3   
4       A1          A               12  3   
3       C1          C               12  3   
2       C2          C               15  3

Поскольку мне нужна отдельная строка для каждой группы продуктов, которую я использую ниже, Запрос

SELECT 
      SUM(Qty) as UsedQty, 
      ProductGroup, 
      RecordID 
FROM ProductUsageData 
GROUP BY ProductGroup, RecordID  
ORDER BY RecordID ASC;

В то время как я получаю три записи для A (для каждого RecordID) я получаю только 1 запись для B & C, поскольку они не используются во время каждого RecordID. Проблема в том, что, когда я помещаю по одной строке для каждой группы продуктов в диаграмме, точки для B & C отображаются в соответствии с количеством в первом выводе. Мой вывод выглядит следующим образом

A   39  1
A   12  2
B   17  2
A   39  3
C   27  3   

Таким образом, график выглядит так: это

enter image description here

вместо

enter image description here

Чтобы исправить это, я изменил запрос с использованием COALESCE для получения 0 Qty, если ProductGroup не используется во время каждой записи.

SELECT 
       COALESCE(SUM(Qty), 0) as UsedQty, 
       ProductGroup, 
       RecordID 
FROM ProductUsageData 
GROUP BY ProductGroup, RecordID  
ORDER BY RecordID ASC;

Я ожидал вывод, как показано ниже

A   39  1
B   0   1
C   0   1
A   12  2
B   17  2
C   0   2
A   39  3
B   0   3
C   27  3

Но я получаю тот же вывод, что и первый

Пожалуйста, дайте мне знать, как я могу исправить запрос, чтобы получить желаемый результат

1 Ответ

1 голос
/ 13 февраля 2020

Типичное решение - сначала cross join два запроса, которые выбирают отдельные группы продуктов и идентификаторы записей из таблицы; это дает вам все возможные комбинации productGroup и recordID.

. Затем вы можете ввести в исходную таблицу символ left join и собрать:

select
    g.productGroup,
    coalesce(sum(p.qty), 0) qty,
    r.recordID
from (select distinct productGroup from productUsageData) g
cross join (select distinct recordID from productUsageData) r
left join productUsageData p
    on  p.productGroup = g.productGroup
    and p.recordID = r.recordID
group by r.recordID, g.productGroup
order by r.recordID, g.productGroup

. в реальности у вас могут быть отдельные ссылочные таблицы для групп продуктов и идентификаторов записей, что сделает запрос более простым и эффективным (поскольку это позволит избежать необходимости select distinct в подзапросах).

Демонстрация на DB Fiddle :

productGroup | qty | recordID
:----------- | :-- | :-------
A            | 39  | 1       
B            | 0   | 1       
C            | 0   | 1       
A            | 12  | 2       
B            | 17  | 2       
C            | 0   | 2       
A            | 39  | 3       
B            | 0   | 3       
C            | 27  | 3       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...