Агрегаты db2 и случай, когда условия дают повторяющиеся значения и неверные данные - PullRequest
0 голосов
/ 11 марта 2020

У меня есть простой запрос с объединением, который корректно возвращает информацию о продуктах:

select
            t1.category,
            t1.color,
            t1.size,
            t2.aisle

from infoTable t1

inner join locationTable t2 on t1.aisleNumber = t2.aisleNumber;

Это возвращает

category  |  color  |  size  |  aisle
--------------------------------------
A             Red       S        F12
B             Blue      M        G18
C             Green     L        H9
D             Yellow    XL       D19

Пока все хорошо.

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

select
            t1.category,
            t1.color,
            t1.size,
            t2.aisle,
            count(case when t3.storeNumber = 11 then 1 else 0 end) as storeNumber11
            count(case when t3.storeNumber = 31 then 1 else 0 end) as storeNumber31
            count(case when t3.storeNumber = 41 then 1 else 0 end) as storeNumber41

from infoTable t1

inner join locationTable t2 on t1.aisleNumber = t2.aisleNumber
inner join storeTable t3    on t1.category = t3.category and t1.color = t3.color and t1.size = t3.size

group by t1.category,t1.color,t1.size,t2.aisle,t3.storeNumber

Я близок, но результаты неверны. Я получаю это:

    category  |  color  |  size  |  aisle  |  storeNumber11 |  storeNumber31  |  storeNumber41
    --------------------------------------------------------------------------------------------
    A             Red       S        F12         17                 17                  17
    B             Blue      M        G18         12                 12                  12
    C             Green     L        H9          14                 14                  14
    D             Yellow    XL       D19         16                 16                  16

Я знаю факт после ручной проверки, что первая строка должна иметь 17 для storeNumber11, но ноль для 31 и 41. Вторая строка должна иметь ноль для storeNumber11 и 12 для storeNumber31.

Так что тот факт, что я не получаю нулей и повторяю только одно и то же значение, показывает мне, что что-то явно не так. В противном случае я получаю правильное количество строк и информацию, но как я могу исправить это, чтобы правильно подсчитать только те номера магазинов, если выполняется соединение с t3?

1 Ответ

3 голосов
/ 11 марта 2020

Использование sum(), а не count():

select
        t1.category,
        t1.color,
        t1.size,
        t2.aisle,
        sum(case when t3.storeNumber = 11 then 1 else 0 end) as storeNumber11
        sum(case when t3.storeNumber = 31 then 1 else 0 end) as storeNumber31
        sum(case when t3.storeNumber = 41 then 1 else 0 end) as storeNumber41
. . . 

count(<x>) подсчитывает количество не NULL значений. 0 так же не NULL, как 1.

...