Как я могу отобразить процент моих столбцов - PullRequest
1 голос
/ 25 октября 2019

Я хочу рассчитать процент в каждом месяце для каждого typeItem по отношению ко всем typeItem, как мне этого добиться?

У меня есть таблица с typeItem, AMOUNT, month следующим образом

SELECT
    SUM(CASE WHEN MONTH = 1 THEN AMOUNT END) "JAN"
    SUM(CASE WHEN MONTH = 2 THEN AMOUNT END) "FEB"
...
FROM (SELECT AMOUNT, MONTH, ItemTYPE FROM MY TABLE)
GROUP BY typeItem

ЧТО ДАЕТ МНЕ

OUTPUT:
ItemType  JAN   FEB  ...

A         123   456
B         234   567
...

- НО ХОЧУ:

SELECT
    SUM(CASE WHEN MONTH = 1 THEN AMOUNT END) "JAN"
--CALCULATE PERCENTAGE FOR JAN (AMOUNT ItemType/AMOUNT ALL ItemType) "JAN %"
    SUM(CASE WHEN MONTH = 2 THEN AMOUNT END) "FEB"
--CALCULATE PERCENTAGE FOR FEB(AMOUNT ItemType/AMOUNT ALL ItemType) "FEB %"
...
FROM (SELECT PRICE, MONTH, ItemTYPE FROM MY TABLE)
GROUP BY typeItem
OUTPUT:
ItemType  JAN  JAN%        FEB     FEB%  ...

A         123   0.11       456     0.15
B         234   0.13       567     0.16
...

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Вы можете достичь этого, используя аналитическую функцию следующим образом:

SELECT
    SUM(CASE WHEN MONTH = 1 THEN AMOUNT END) AS JAN,
    SUM(CASE WHEN MONTH = 1 THEN AMOUNT END) / MAX(CASE WHEN MONTH = 1 THEN SM END) AS "JAN%",
    SUM(CASE WHEN MONTH = 2 THEN AMOUNT END) AS FEB,
    SUM(CASE WHEN MONTH = 2 THEN AMOUNT END) / MAX(CASE WHEN MONTH = 2 THEN SM END) AS "FEB%"
...
FROM (SELECT AMOUNT, MONTH, ItemTYPE,
SUM(AMOUNT) OVER (PARTITION BY MONTH) AS SM
FROM MY TABLE)
GROUP BY typeItem

Примечание : вам необходимо обработать сценарий деления на ноль в случае, если сумма суммы в месяце равна нулю.

Ура !!

0 голосов
/ 25 октября 2019

Вы можете просто разделить:

SELECT SUM(CASE WHEN MONTH = 1 THEN AMOUNT END) as "JAN",
       SUM(CASE WHEN MONTH = 1 THEN AMOUNT END) / SUM(SUM(CASE WHEN MONTH = 1 THEN AMOUNT END)) OVER () as "JAN",       
       SUM(CASE WHEN MONTH = 2 THEN AMOUNT END) as "FEB",
       SUM(CASE WHEN MONTH = 2 THEN AMOUNT END) / SUM(SUM(CASE WHEN MONTH = 2 THEN AMOUNT END)) OVER () as "FEB",
       . . .
FROM T
WHERE MONTH IN (1, 2, . . . )
GROUP BY typeItem
...