I have a query below.
The SUM should be the SIX_AGO + FIVE_AGO + FOUR_AGO + etc.
But the SUM give all the times wrong numbers.
Is there anything I am doing wrong?
SELECT
COUNT(CASE WHEN MY_DATE_COL BETWEEN to_date(TRUNC(sysdate, 'DAY') - 365 - diff ) AND to_date(TRUNC(sysdate, 'DAY') + 6 - diff) then 1 END) AS SUM,
COUNT(CASE WHEN MY_DATE_COL BETWEEN to_date(TRUNC(sysdate, 'DAY') - 365 - diff ) AND to_date(TRUNC(sysdate, 'DAY') - 36 - diff) then 1 END) AS SIX_AGO,
COUNT(CASE WHEN MY_DATE_COL BETWEEN to_date(TRUNC(sysdate, 'DAY') - 35 - diff ) AND to_date(TRUNC(sysdate, 'DAY') - 29 - diff) then 1 END) AS FIVE_AGO,
COUNT(CASE WHEN MY_DATE_COL BETWEEN to_date(TRUNC(sysdate, 'DAY') - 28 - diff ) AND to_date(TRUNC(sysdate, 'DAY') - 22 - diff) then 1 END) AS FOUR_AGO,
COUNT(CASE WHEN MY_DATE_COL BETWEEN to_date(TRUNC(sysdate, 'DAY') - 21 - diff ) AND to_date(TRUNC(sysdate, 'DAY') - 15 - diff) then 1 END) AS THREE_AGO,
COUNT(CASE WHEN MY_DATE_COL BETWEEN to_date(TRUNC(sysdate, 'DAY') - 14 - diff ) AND to_date(TRUNC(sysdate, 'DAY') - 8 - diff) then 1 END) AS TWO_AGO,
COUNT(CASE WHEN MY_DATE_COL BETWEEN to_date(TRUNC(sysdate, 'DAY') - 7 - diff ) AND to_date(TRUNC(sysdate, 'DAY') - 1 - diff) then 1 END) AS ONE_AGO,
COUNT(CASE WHEN MY_DATE_COL BETWEEN to_date(TRUNC(sysdate, 'DAY') - diff ) AND to_date(TRUNC(sysdate, 'DAY') + 6 - diff) then 1 END) AS NO_AGO
FROM TEST
Best Answer
The question does not contain test data, and some details are not quite clear eg we don't know what the "diff" in the original query stands for. Suppose we have the following test table (assuming that diff is just a constant value):
Original query
The counts for the "sections" (SIX_AGO, FIVE_AGO etc) do not add up to the expected "SUM".
The problem seems to be that the nested functions used in BETWEEN ... AND ... lead to incorrect counts. Thus, I suggest that we rewrite the query in a way that allows us to use integer values for the between conditions. Something like ...