2009-10-08 8 views
8

Muszę ustalić, ile osób złożyło (fil_dt) zeznanie podatkowe w ciągu 60 dni, z 120 dniami, w ciągu 180 dni, przez 180 dni od daty zakończenia okresu przechowywania (fpe) dla 3 różne lata (2006, 2007, 2008)Zapytanie SQL z policzeniem i stwierdzeniem sprawy

Poniższe zestawienie da mi WSZYSTKIE lata Potrzebuję liczby dla każdego roku i dla każdej możliwości .. w każdym razie mogę to zrobić bez 2 zapytań?

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' 

potrzebuję twojej pomocy dzięki dużo

+1

gdzie jest od? –

Odpowiedz

22

następnie napisać

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) 

Jeśli chcesz liczyć 120 dni, a liczba 180 dni tylko to ludzie, którzy mają ponad 60 lat i mniej niż 120, itd. Wtedy,

 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

Sumy sumują się do więcej niż '100%': '<60' oznacza' <120' i dalsze. Myślę, że '@ op' oznaczało coś w rodzaju' od 0 do 60', 'od 61 do 120' i tak dalej. – Quassnoi

+0

@Quassnoi, Tak, Dodano drugie zapytanie, aby pokazać, jak robić wyjątkowe liczby ... Ale jak podświetliłeś tekst w komentarzu? Proszę powiedzieć ... –

+0

'@Charles Bretana': tak jak robisz to w postach, zamykając tekst w tyłach i gwiazdkach. – Quassnoi

2

grupie przez kolumnę Twój case oznacza:

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" 

To zapytanie daje liczbę każdym rekordzie dla każdego unikalnego roku/Kombinacja "NBR MTH".

1

Właściwie większość DBMS nie pozwalają grupy za pomocą aliasów, więc musi być

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

przeciwieństwie do prostego GROUP BY YEAR(), to wybrać 0 nawet dla brakujących zapisów (jak, jeśli istnieje nie były 6+ rekordy w 2008)