Я пытаюсь получить сумму или количество транзакций в год, у меня есть этот код, но мне нужна помощь в его правильном - PullRequest
0 голосов
/ 12 февраля 2020
select (cus_name||bra_code),
  sum(case when tra_date between '01jan2019' AND '31Dec2019' THEN 2019 else 0 end) as o  
  sum(case when tra_date between '01jan2018' AND '31Dec2018' THEN 2018 else 0 end)) as F 
  sum(case when tra_date between '01jan2017' AND '31Dec2017' THEN 2017 else 0 end)as H
from stg.v_src_pend_tra@exadata_new
group by cus_name,bra_code

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

Вы можете использовать DATE литералы вместо попытки полагаться на неявное преобразование строки (то есть '01jan2019') в дату.

Если вы отфильтруете BETWEEN DATE '2019-01-01' AND DATE '2019-12-31', тогда получатся все даты от 2019-01-01T00:00:00 до 2019-12-31T00:00:00. Если ваши даты всегда установлены так, что компонент времени находится в полночь (все значения даты всегда имеют компонент времени в Oracle), тогда это будет работать, но если у вас есть компонент времени, отличный от полуночи, то вы пропустите значения между 2019-12-31T00:00:01 и 2019-12-31T23:59:59.

Чтобы решить эту проблему, вам необходимо использовать:

SELECT cus_name || bra_code,
       COUNT(
         CASE
         WHEN tra_date >= DATE '2019-01-01'
         AND  tra_date <  DATE '2020-01-01'
         THEN tra_date
         END
       ) AS o, 
       COUNT(
         CASE
         WHEN tra_date >= DATE '2018-01-01'
         AND  tra_date <  DATE '2019-01-01'
         THEN tra_date
         END
       ) AS f,
       COUNT(
         CASE
         WHEN tra_date >= DATE '2017-01-01'
         AND  tra_date <  DATE '2018-01-01'
         THEN tra_date
         END
       ) AS H
FROM   stg.v_src_pend_tra@exadata_new
GROUP BY cus_name, bra_code;

(Вам также нужны запятые после каждого выражения в части SELECT оператора и до снимите дополнительную закрывающую скобку.)

0 голосов
/ 12 февраля 2020

Я думаю, вам просто нужны суммы. В этом случае 1 для каждой транзакции:

select (cus_name || bra_code),
       sum(case when tra_date between date '2019-01-01' and date '2019-12-31' then 1 else 0 end) as o, 
       sum(case when tra_date between date '2018-01-01' and date '2018-12-31' then 1 else 0 end)) as F,
       sum(case when tra_date between date '2017-01-01' and date '2017-12-31' then 1 else 0 end) as H
from stg.v_src_pend_tra@exadata_new
group by cus_name, bra_code;

Обратите внимание, что я также изменил константы даты, чтобы они соответствовали стандартам ISO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...