2009-10-08 12 views
8

i necesidad de encontrar cuántas personas se han presentado (fil_dt) su declaración de impuestos dentro de los 60 días, withing 120 días, dentro de los 180 días, más de 180 días de su fecha de presentación final del período (FPE) para 3 años diferentes (2006, 2007, 2008)consulta SQL con la declaración recuento y la caja

la siguiente declaración me dará TODOS los años necesito un recuento para cada año y para cada posibilidad ... de todos modos puedo hacerlo sin 2 consultas?

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' 

necesito su ayuda muchas gracias

+1

donde es la DE? –

Respuesta

22

luego escribir

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) 

Si desea que el conteo de 120 días y el conteo de 180 días para incluir sólo las personas que son más de 60 y menos de 120, etc, entonces,

 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) 
+1

Las sumas sumarán más de '100%': '<60' implica' <120' y más. Creo que el '@ op' significa algo así como' de 0 a 60', 'de 61 a 120' y así sucesivamente. – Quassnoi

+0

@Quassnoi, Sí, se agregó una segunda consulta para mostrar cómo hacer recuentos exclusivos ... Pero, ¿cómo resaltaste el texto en un comentario? Informe a ... –

+0

'@Charles Bretana': al igual que lo hace en los postes, que encierra el texto en acentos abiertos y asteriscos. – Quassnoi

2

Grupo por la columna de su declaración de caso representa:

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" 

Esta consulta le dará un recuento de todos los registros para cada año único/Combinación "NBR MTH".

1

En realidad, la mayoría de los DBMS no permiten el uso de alias GROUP BY, por lo que deben ser

... 
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 
3
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 

A diferencia de la simple GROUP BY YEAR(), esto seleccionará 0 incluso para los registros faltantes (como, si hay hubo 6+ registros en 2008)

Cuestiones relacionadas