i need to find how many people have filed (fil_dt) their tax return within 60 days, withing 120 days, within 180 days, over 180 days of their filing period end date (fpe) for 3 different years (2006, 2007, 2008)
the statement below will give me ALL years
i need a count for each year and for each possibility..
anyway i can do this without 2 queries ?
SELECT YEAR(A.FPE) AS "YEAR"
,CASE
WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) < 60 THEN '2 '
WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) < 120 THEN '4 '
WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) < 180 THEN '6 '
WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) > 180 THEN '6+'
END AS "NBR MTH"
WHERE A.FPE BETWEEN '2006-01-01' AND '2008-12-31'
i need your help
thanks a lot
then write
SELECT YEAR(A.FPE) AS "YEAR",
Sum(CASE WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) < 60
THEN 1 Else 0 End) SixtydayCount,
Sum(CASE WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) < 120
THEN 1 Else 0 End) OneTwentyDayCount,
Sum(CASE WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) < 180
THEN 1 Else 0 End) OneEightyDayCount,
Sum(CASE WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) > 180
THEN 1 Else 0 End) OverOneEightyCount
From Table A
WHERE A.FPE BETWEEN '2006-01-01' AND '2008-12-31'
Group By YEAR(A.FPE)
If you want the 120 day count and the 180 day count to only include the folks who are over 60 and less than 120, etc. then,
SELECT YEAR(A.FPE) AS "YEAR",
Sum(CASE WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) < 60
THEN 1 Else 0 End) SixtydayCount,
Sum(CASE WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) Between 60 And 119
THEN 1 Else 0 End) OneTwentyDayCount,
Sum(CASE WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) Between 120 And 179
THEN 1 Else 0 End) OneEightyDayCount,
Sum(CASE WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) >= 180
THEN 1 Else 0 End) OverOneEightyCount
From Table A
WHERE A.FPE BETWEEN '2006-01-01' AND '2008-12-31'
Group By YEAR(A.FPE)
SELECT CASE
WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) < 60 THEN '2 '
WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) < 120 THEN '4 '
WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) < 180 THEN '6 '
WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) > 180 THEN '6+'
END AS NBR_MTH,
y,
COUNT(a.fpe)
FROM (
SELECT 2006 AS y
UNION ALL
SELECT 2007 AS y
UNION ALL
SELECT 2008 AS y
)
LEFT JOIN
A
ON A.FPE >= CAST(CONCAT(y, '-01-01') AS DATETIME)
AND a.FPE < CAST(CONCAT(y + 1, '-01-01') AS DATETIME)
GROUP BY
y, mbr_mth
Unlike the simple GROUP BY YEAR()
, this will select 0
even for the missing records (like, if there were no 6+
records in 2008
)
Group by the column your case statement represents:
SELECT
YEAR(A.FPE) AS "YEAR",
CASE
WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) < 60 THEN '2 '
WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) < 120 THEN '4 '
WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) < 180 THEN '6 '
WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) > 180 THEN '6+'
END AS "NBR MTH",
COUNT(1) AS "TOTAL"
FROM Table
WHERE
A.FPE BETWEEN '2006-01-01' AND '2008-12-31'
GROUP BY
"YEAR",
"NBR MTH"
This query will give you a count of every record for each unique year/"NBR MTH" combination.
Actually, most DBMSs don't allow GROUP BY using aliases, so it must be
...
GROUP BY
YEAR(A.FPE),
CASE
WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) < 60 THEN '2 '
WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) < 120 THEN '4 '
WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) < 180 THEN '6 '
WHEN DAYS(A.FIL_DT) - DAYS(A.FPE) > 180 THEN '6+'
END