Сумма агрегации для отдельных групп с помощью сводки? - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь получить сумму агрегации за последние 3 дня для каждой отдельной группы. Однако я не понимаю, чего ожидал. Может кто-нибудь показать мне, как получить ожидаемый результат, возможно, с помощью pivot?

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

select *,
case when group = 'Red' then count(NVL(amount,0)) OVER (PARTITION BY ACCOUNT, group ORDER BY day_number range 2 PRECEDING),
case when group = 'Yellow' then count(NVL(amount,0)) OVER (PARTITION BY ACCOUNT, group ORDER BY day_number range 2 PRECEDING)
from table

ожидаемый результат

Account Group   Sum day_number  Red Yellow
abc     Red     20  1           20  0
abc     Red     30  3           50  0
abc     Yellow  40  4           50  40
def     Red     20  5           20  40
def     Yellow  50  8           0   50
def     Yellow  20  9           0   70

неправильный вывод

Account Group   Sum day_number  Red Yellow
abc     Red     20  1           20  
abc     Red     30  3           50  
abc     Yellow  40  4               40
def     Red     20  5           20  
def     Yellow  50  8               50
def     Yellow  20  9               70

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Если вы хотите сделать столбцы red и yellow независимыми от учетной записи и группы, просто удалите часть partition by.

Демоверсия dbfiddle

select t.*,
       nvl(sum(case grp when 'Red'    then amount end) 
           over (order by day_number range 2 preceding), 0) red,
       nvl(sum(case grp when 'Yellow' then amount end) 
           over (order by day_number range 2 preceding), 0) yellow
  from t

что дает нам результат:

ACCOUNT GRP        AMOUNT DAY_NUMBER        RED     YELLOW
------- ------ ---------- ---------- ---------- ----------
abc     Red            20          1         20          0
abc     Red            30          3         50          0
abc     Yellow         40          4         30         40
def     Red            20          5         50         40
def     Yellow         50          8          0         50
def     Yellow         20          9          0         70

Обратите внимание, что в третьей строке столбца RED есть разница (вы ввели 50, запрос показывает 30), но для дня 4 у нас есть только одно красное значение из двух предыдущих дней, которое составляет 30.

Если вам просто нужно повторить значения для нулей, используйте вместо этого lag, но для меня это не имеет смысла.

Вы можете сделать это с помощью pivot, но вам нужно было правильно подготовить данные в подзапросе, а затем сделать pivot. В этом случае синтаксис case when более читабелен.

1 голос
/ 27 марта 2019

Я думаю, что вы в основном хотите sum() вместо count():

select t.*,
       (case when group = 'Red'
             then sum(amount) over (partition by account, group order by day_number range between 2 preceding and current row)
        end) as red,
       (case when group = 'Yellow'
             then sum(amount) over (partition by account, group order by day_number range between 2 preceding and current row)
        end) as red
from table t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...