8

3 つの異なる年 (2006 年、2007 年、2008 年) の申告期間の終了日 (fpe) から 60 日以内、120 日以内、180 日以内、180 日以内に、何人の人々が納税申告書 (fil_dt) を提出したかを調べる必要があります。

以下のステートメントは、すべての年を示します。毎年、可能性ごとにカウントが必要です。とにかく、2つのクエリなしでこれを行うことができますか?

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'

あなたの助けが必要です どうもありがとう

4

4 に答える 4

22

それから書く

   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)

120 日のカウントと 180 日のカウントに 60 歳以上 120 歳未満の人のみを含める場合は、次のようにします。

     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)
于 2009-10-08T14:44:07.737 に答える
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

単純な とは異なりGROUP BY YEAR()、これは欠落しているレコードに対しても選択します(たとえば、 にレコード0がなかった場合)6+2008

于 2009-10-08T14:43:35.447 に答える
2

case ステートメントが表す列でグループ化します。

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"

このクエリは、一意の年と「NBR MTH」の組み合わせごとにすべてのレコードの数を示します。

于 2009-10-08T14:39:14.113 に答える
1

実際、ほとんどの DBMS ではエイリアスを使用した GROUP 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
于 2009-10-08T14:42:34.870 に答える