Делать накопительный подсчет, если в Oracle SQL - PullRequest
0 голосов
/ 14 сентября 2018

Пожалуйста, смотрите прикрепленный файл для справки. Допустим, у меня есть таблица CARRIER_RESPONSE со следующими полями Carrier, Shipment, Acceptance, Day

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

Пока я пришел к следующему коду:

SELECT Carrier
,Shipment
,Acceptance
,Day
,ROW_NUMBER() OVER (
                        PARTITION BY Carrier
                        , Day
                        , Acceptance
                        ORDER BY Day
                    ) AS "Cumulative Count of Acceptance per Day"
FROM CARRIER_RESPONSE

Этот код дает мне правильный счетчик операций для Линий с Ответом о принятии = A, но в строках с Ответом о принятии = D Я также хочу показать текущий счетчик Ответа о принятии = A.

По существу, на каждой строке я хочу указать, сколько раз сегодня Перевозчик принимал Отправку. Это возможно?

Спасибо

Amir

Ответ перевозчика:

Carrier Response

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

После перечитывания кажется, что вам нужно считать как A, так и D

.
 SELECT Carrier
        ,Shipment
        ,Acceptance
        ,Day
        ,sum(Case when Acceptance='A' then 1 else 0 end) OVER (
                                PARTITION BY Carrier                                
                                ORDER BY Day                                
                            ) AS "Cumulative Count of Acceptance per Day",
sum(Case when Acceptance='D' then 1 else 0 end) OVER (
                                PARTITION BY Carrier                                
                                ORDER BY Day                                
                            ) AS "Cumulative Count for Deny per Day"
        FROM CARRIER_RESPONSE
0 голосов
/ 14 сентября 2018

Я думаю, что вы хотите:

SELECT Carrier, Shipment, Acceptance, Day,
       SUM(CASE WHEN Acceptance = 'A' THEN 1 ELSE 0 END) OVER
           (PARTITION BY Carrier
            ORDER BY Day
           ) AS "Cumulative Count of Acceptance per Day"
FROM CARRIER_RESPONSE;

Если Acceptance принимает только значения 'A' и NULL, то вы можете сократить это значение до:

SELECT Carrier, Shipment, Acceptance, Day,
       COUNT(Acceptance) OVER
           (PARTITION BY Carrier
            ORDER BY Day
           ) AS "Cumulative Count of Acceptance per Day"
FROM CARRIER_RESPONSE;
0 голосов
/ 14 сентября 2018

Один из способов сделать это - использовать сумму с предложением аналитики и обработкой окон.

SELECT Carrier
,Shipment
,Acceptance
,Day
,sum(Case when Acceptance is not null then 1 else 0 end) OVER (
                        PARTITION BY Carrier
                        , Day
                        ORDER BY Day
                        ROWS between unbounded preceding and current row
                    ) AS "Cumulative Count of Acceptance per Day"
FROM CARRIER_RESPONSE
...