views:

712

answers:

4

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

+1  A: 

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.

Welbog
+1  A: 

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
ercan
+1  A: 
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)

Quassnoi
A: 

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)
Charles Bretana
The sums will add up to more than `100%`: `< 60` implies `< 120` and further. I think the `@op` meant something like `from 0 to 60`, `from 61 to 120` and so on.
Quassnoi
@Quassnoi, Yes, Added second query to show how to do exclusive counts... But How did you highlight text in a comment ? Please tell...
Charles Bretana
`@Charles Bretana`: just like you do it in the posts, enclosing the text into backticks and asterisks.
Quassnoi