Вы можете использовать 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
оператора и до снимите дополнительную закрывающую скобку.)