2009-10-08 8 views
8

J'ai besoin de savoir combien de personnes ont rempli leur déclaration de revenus dans les 60 jours, avec 120 jours, dans les 180 jours, sur 180 jours de la date de fin de leur période de dépôt (fpe) pour La déclaration ci-dessous me donnera TOUTES les années J'ai besoin d'un compte pour chaque année et pour chaque possibilité .. de toute façon je peux le faire sans 2 requêtes?Requête SQL avec décompte et instruction

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 besoin de votre aide merci beaucoup

+1

où est FROM? –

Répondre

22

puis écrire

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 vous voulez que le nombre de 120 jours et le nombre de 180 jours pour inclure uniquement les gens qui sont plus de 60 et moins de 120, etc., puis,

 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

Les sommes totaliseront plus de '100%': '<60' implique' <120' et plus loin. Je pense que le '@ op 'signifiait quelque chose comme« de 0 à 60 »,« de 61 à 120 »et ainsi de suite. – Quassnoi

+0

@Quassnoi, Oui, Ajout d'une deuxième requête pour montrer comment faire des comptes exclusifs ... Mais comment avez-vous mis en évidence le texte dans un commentaire? S'il vous plaît dire ... –

+0

'@Charles Bretana': tout comme vous le faites dans les messages, en enfermant le texte dans les guillemets et les astérisques. – Quassnoi

2

Groupe de la colonne de votre déclaration de cas représente:

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" 

Cette requête vous donnera un compte de tous les records pour chaque année uniques/Combinaison "NBR MTH".

1

En fait, la plupart des DBMS ne permettent pas GROUP BY en utilisant des alias, il doit être

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

Contrairement à la GROUP BY YEAR() simple, ce qui sélectionnera 0 même pour les documents manquants (comme, en cas étaient pas 6+ enregistrements 2008)