6

私は1つのテーブルを持っています(ただし、多くの場所にあります):

DATE         STUFF
-------------------
2011-12-01   DATA
2011-12-02   DATA
2011-12-03   DATA
...
2011-12-31   DATA
2012-01-01   DATA
2012-01-02   DATA

私のテーブルは 2005 年から 2012 年までの複数の年をカバーしています。各年の各月の AGGREGATE 関数の値、つまり SUM/AVG/MAX/MIN を取得したいと考えています。簡単:

GROUP BY DATE_FORMAT(DATE, '%Y'), DATE_FORMAT(DATE, '%m')

私はそれらの年の 3 か月の期間について同じことをしたいです...これは 1 つを除くすべてで機能します:

GROUP BY DATE_FORMAT(DATE, '%Y'), DATE_FORMAT(DATE, '%m') IN (12, 01, 02)

私の他の期間は、同じ年 (03, 04, 05)、(06, 07, 08)、および (09, 10, 11) にあるため、機能します...しかし、上記の GROUP BY は 2012 年 12 月をグループ化しています私の期間は、2011 年 12 月と 2012 年 1 月/2 月、2010 年 12 月と 2011 年 1 月/2 月でなければなりません... ...

この汎用性を維持したいので、複数の場所のストアド プロシージャにコードを配置するために、日付範囲で更新する必要はありません。

MONTH 12 の場合、1 年先の年を 1 つずらして、表を自分自身に結合しようとしました。これにより、望ましくない結果が生じました。

4

5 に答える 5

3
 GROUP BY floor((month(DATE) + year(DATE) * 12 -1 + %month_shift%) / %month_group_period%)

この例では、%month_group_period% は 3 で
あり、%month_shift% は 1 であり、12 月、1 月、2 月などをまとめて取得します。

編集: これは5か月間も機能します(必要な場合)

于 2012-08-13T16:10:07.023 に答える
1

私はあなたが本当にやりたいことについてここで少し仮定していますがDATE_FORMAT(DATE, '%m') IN (12, 01, 02)

SELECT IF(DATE_FORMAT(DATE, '%m') = 12, DATE_FORMAT(DATE, '%Y') + 1, DATE_FORMAT(DATE, '%Y')) AS yr, 
    CASE DATE_FORMAT(DATE, '%m')
        WHEN 12 THEN 1
        WHEN 1 THEN 1
        WHEN 2 THEN 1
        WHEN 3 THEN 2
        WHEN 4 THEN 2
        WHEN 5 THEN 2
        WHEN 6 THEN 3
        WHEN 7 THEN 3
        WHEN 8 THEN 3
        WHEN 9 THEN 4
        WHEN 10 THEN 4
        WHEN 11 THEN 4
    END AS qtr
FROM ...
GROUP BY IF(DATE_FORMAT(DATE, '%m') = 12, DATE_FORMAT(DATE, '%Y') + 1, DATE_FORMAT(DATE, '%Y')), 
    CASE DATE_FORMAT(DATE, '%m')
        WHEN 12 THEN 1
        WHEN 1 THEN 1
        WHEN 2 THEN 1
        WHEN 3 THEN 2
        WHEN 4 THEN 2
        WHEN 5 THEN 2
        WHEN 6 THEN 3
        WHEN 7 THEN 3
        WHEN 8 THEN 3
        WHEN 9 THEN 4
        WHEN 10 THEN 4
        WHEN 11 THEN 4
    END
于 2012-08-13T16:01:13.923 に答える
0

私はこのようなことを試みます:

GROUP BY DATE_FORMAT(IF(MONTH(`DATE`)=12,DATE_ADD(`DATE`,INTERVAL 1 YEAR),`DATE`),'%Y')
       , DATE_FORMAT(`DATE`,'%m')

基本的に、月が12の場合、それに1年を追加します。

実際、私はそれを次のようにする傾向があります:

GROUP BY DATE_FORMAT(DATE_ADD(`DATE`,INTERVAL IF(MONTH(`DATE`)=12,1,0) YEAR),'%Y')
       , CASE WHEN MONTH(`DATE`) IN (12,1,2) THEN 1
              WHEN MONTH(`DATE`) IN (3,4,5) THEN 2
              WHEN MONTH(`DATE`) IN (6,7,8) THEN 3
              WHEN MONTH(`DATE`) IN (9,10,11) THEN 4
          END
于 2012-08-13T16:04:06.330 に答える
0

GROUP BYあなたがやろうとしている方法を使いたいとは思わない。おそらく、次のようにクエリを書きたいと思うでしょう

SELECT MONTH(date) as `month`, SUM(stuff) as `sum`
FROM table
WHERE YEAR(date) IN ('2010', '2011', 2012')
GROUP BY `month`

GROUP BY 句は、データをフィルタリング/フォーマットする必要がある場所ではありません。

もちろん、SUM の代わりに任意の集計関数を使用できます。また、すべての年の WHERE 句を省略したり、必要に応じて含める年を変更したりできます。

年と月が必要な場合は、次のようにクエリを変更するだけです。

SELECT YEAR(date) as `year`, MONTH(date) as `month`, SUM(stuff) as `sum`
FROM table
WHERE `year` IN ('2010', '2011', 2012')
GROUP BY `year`, `month`
于 2012-08-13T16:02:01.757 に答える
0

次の方法で、グループの日付から 1 か月を減算する必要があります。

GROUP BY DATE_FORMAT(date_add(DATE,  interval 1 month), '%Y'),
         DATE_FORMAT(date_add(date, interval 1 month), '%m') IN (12, 01, 02)

おそらく選択も変更する必要があります。

select DATE_FORMAT(date_add(date_add(DATE,  interval 1 month), interval -1 month), '%Y'),
       DATE_FORMAT(date_add(date_add(date, interval 1 month), interval -1 month), '%m')
于 2012-08-13T16:03:01.107 に答える