подзапросы с разными группировками в db2 неправильно возвращают результаты деления - PullRequest
0 голосов
/ 25 января 2019

Я абсолютно не могу понять, что я делаю неправильно.

Мои данные здесь близки, но мои подзапросы V2 и V3 не возвращают правильные данные, и я думаю, что это основано на том факте, что я пытаюсь разделить на группы по сумме, и мне кажется, что он использует тот же номер strCount через доску.

Запрос:

WITH T (employee, manager, GROUP, detail1, detail2, strCount, QUANT, LAST_SHIP_DATE) AS (
VALUES  (21177, 165, 4867, 2878, 29, 1, 1, CURRENT DATE - 10 DAY),
        (19445, 182, 4867, 2878, 29, 1, 1, CURRENT DATE - 10 DAY),
        (20949, 340, 4867, 2878, 29, 1, 2, CURRENT DATE - 10 DAY),
        (21347, 353, 4867, 2878, 29, 1, 1, CURRENT DATE - 10 DAY),
        (23068, 353, 4867, 2878, 29, 1, 1, CURRENT DATE - 10 DAY),
        (17195, 353, 4867, 2878, 29, 1, 6, CURRENT DATE - 10 DAY),
        (23040, 353, 4867, 2878, 29, 1, 1, CURRENT DATE - 10 DAY),
        (5620,  380, 4867, 2878, 29, 1, 4, CURRENT DATE - 10 DAY),
        (23009, 380, 4867, 2878, 29, 1, 3, CURRENT DATE - 10 DAY),
        (13529, 390, 4867, 2878, 29, 1, 1, CURRENT DATE - 10 DAY),
        (22706, 394, 4867, 2878, 29, 1, 1, CURRENT DATE - 10 DAY),
        (17049, 394, 4867, 2878, 29, 1, 4, CURRENT DATE - 10 DAY),
        (17879, 397, 4867, 2878, 29, 1, 1, CURRENT DATE - 10 DAY),
        (21320, 445, 4867, 2878, 29, 1, 1, CURRENT DATE - 10 DAY),
        (21231, 457, 4867, 2878, 29, 1, 1, CURRENT DATE - 10 DAY)
)
SELECT T.employee, T.manager, T.GROUP, T.detail1, T.detail2, T.strCount, T.QUANT
, COALESCE(T1.V1, 0) V1, COALESCE(T2.V2, 0) V2, COALESCE(T3.V3, 0) V3
FROM T
LEFT JOIN (
SELECT employee, GROUP, detail1, detail2, SUM(QUANT)/SUM(strCount)*12 V1
FROM T
WHERE last_ship_date > CURRENT_DATE - 30 DAYS
GROUP BY employee, GROUP, detail1, detail2,strCount
) T1 ON T1.employee=T.employee AND T1.GROUP=T.GROUP AND T1.detail1=T.detail1 AND T1.detail2=T.detail2 
LEFT JOIN (
SELECT manager, GROUP, detail1, detail2, SUM(QUANT)/SUM(strCount)*12 V2
FROM T
WHERE last_ship_date > CURRENT_DATE - 30 DAYS
GROUP BY manager, GROUP, detail1, detail2,strCount
) T2 ON T2.manager=T.manager AND T2.GROUP=T.GROUP AND T2.detail1=T.detail1 AND T2.detail2=T.detail2
LEFT JOIN (
SELECT GROUP, detail1, detail2, SUM(QUANT)/SUM(strCount)*12 V3
FROM T
WHERE last_ship_date > CURRENT_DATE - 30 DAYS
GROUP BY GROUP, detail1, detail2,strCount
) T3 ON T3.GROUP=T.GROUP AND T3.detail1=T.detail1 AND T3.detail2=T.detail2;

Это дает мне

employee | manager | group | detail1 | detail2 | strCount | quant | V1 | V2 | V3
================================================================================
21177    | 165     | 4867  | 2878    | 29      | 1        | 1     | 12 | 12 | 12
19445    | 182     | 4867  | 2878    | 29      | 1        | 1     | 12 | 12 | 12
20949    | 340     | 4867  | 2878    | 29      | 1        | 2     | 24 | 24 | 12
21347    | 353     | 4867  | 2878    | 29      | 1        | 1     | 12 | 24 | 12
23068    | 353     | 4867  | 2878    | 29      | 1        | 1     | 12 | 24 | 12
17195    | 353     | 4867  | 2878    | 29      | 1        | 6     | 72 | 24 | 12
23040    | 353     | 4867  | 2878    | 29      | 1        | 1     | 12 | 24 | 12
5620     | 380     | 4867  | 2878    | 29      | 1        | 4     | 48 | 36 | 12
23009    | 380     | 4867  | 2878    | 29      | 1        | 3     | 36 | 36 | 12
13529    | 390     | 4867  | 2878    | 29      | 1        | 1     | 12 | 12 | 12
22706    | 394     | 4867  | 2878    | 29      | 1        | 1     | 12 | 24 | 12
17049    | 394     | 4867  | 2878    | 29      | 1        | 4     | 48 | 24 | 12
17879    | 397     | 4867  | 2878    | 29      | 1        | 1     | 12 | 12 | 12
21320    | 445     | 4867  | 2878    | 29      | 1        | 1     | 12 | 12 | 12
21231    | 457     | 4867  | 2878    | 29      | 1        | 1     | 12 | 12 | 12

Но ожидая:

employee | manager | group | detail1 | detail2 | strCount | quant | V1 | V2 | V3
==================================================================================
21177    | 165     | 4867  | 2878    | 29      | 1        | 1     | 12 | 12 | 22.4
19445    | 182     | 4867  | 2878    | 29      | 1        | 1     | 12 | 12 | 22.4
20949    | 340     | 4867  | 2878    | 29      | 1        | 2     | 24 | 24 | 22.4
21347    | 353     | 4867  | 2878    | 29      | 1        | 1     | 12 | 27 | 22.4
23068    | 353     | 4867  | 2878    | 29      | 1        | 1     | 12 | 27 | 22.4
17195    | 353     | 4867  | 2878    | 29      | 1        | 6     | 72 | 27 | 22.4
23040    | 353     | 4867  | 2878    | 29      | 1        | 1     | 12 | 27 | 22.4
5620     | 380     | 4867  | 2878    | 29      | 1        | 4     | 48 | 42 | 22.4
23009    | 380     | 4867  | 2878    | 29      | 1        | 3     | 36 | 42 | 22.4
13529    | 390     | 4867  | 2878    | 29      | 1        | 1     | 12 | 12 | 22.4
22706    | 394     | 4867  | 2878    | 29      | 1        | 1     | 12 | 30 | 22.4
17049    | 394     | 4867  | 2878    | 29      | 1        | 4     | 48 | 30 | 22.4
17879    | 397     | 4867  | 2878    | 29      | 1        | 1     | 12 | 12 | 22.4
21320    | 445     | 4867  | 2878    | 29      | 1        | 1     | 12 | 12 | 22.4
21231    | 457     | 4867  | 2878    | 29      | 1        | 1     | 12 | 12 | 22.4

Как я могу правильно изменить это так, чтобы группировки сотрудников, менеджера и итога отражали сгруппированную сумму strCount, а также сгруппированную сумму кванта?

Обновление:

Логика здесь такая

Я хочу получить то же количество строк с соответствующей информацией, как и сейчас, но мои столбцы V1, V2 и V3 должны выглядеть следующим образом:

V1: сумма количества для группировки сотрудник / группа / деталь1 / деталь2, деленная на сумму strCount той же группировки (в настоящее время возвращается правильно)

V2: сумма количества для группировки менеджер / группа / detail1 / detail2, деленная на сумму strCount на ту же группу

V3: сумма общего количества для группы / детали1 / детали2, деленная на сумму общей суммы strCount на ту же группу

1 Ответ

0 голосов
/ 25 января 2019

INT/INT = INT в DB2, т.е. 3/2 = 1, а не 1,5

Используйте decfloat(SUM(QUANT))/SUM(strCount)*12 или dec(SUM(QUANT), 28)/SUM(strCount)*12

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

...