2016-09-30 28 views
0

日付形式の列を持つレコードを持つHalf-Yearlyに基づいてデータを分割するためのMySQLクエリの作成に役立つ人はいますか?MySQLテーブルのデータを半年ごとに集計するにはどうすればよいですか?

GROUP for MonthlyとQuarterlyを書いていますが、半年ごとに発生していません。

私は、毎週、毎月、四半期については、以下のクエリを使用:

CREATE view darren_inventory_mrp_forecast_summary as 
    (SELECT row_number() OVER(ORDER BY sub.product_id) as id, 
      SUM(sub.quantity)/12 as quantity, 
      SUM(sub2.quantity)/4 as quarterly, 
      SUM(sub3.quantity)/51 as weekly, 
      sub.product_id as product_id FROM 
      (SELECT row_number() OVER(ORDER BY product_id) as id, 
        product_id as product_id, 
        SUM(product_qty) as quantity 
      FROM stock_move 
      WHERE consumed_for IS NOT NULL 
      GROUP BY to_char(DATE(create_date), 'YYYY-MM'), product_id 
     ) 
     as sub 
     LEFT JOIN 
      (SELECT row_number() OVER(ORDER BY product_id) as id, 
        product_id as product_id, 
        SUM(product_qty) as quantity 
      FROM stock_move 
      WHERE consumed_for IS NOT NULL 
      GROUP BY to_char(DATE(create_date), 'YYYY-Q'), product_id 
     ) 
     as sub2 on (sub2.product_id=sub.product_id) 
     LEFT JOIN 
      (SELECT row_number() OVER(ORDER BY product_id) as id, 
        product_id as product_id, 
        SUM(product_qty) as quantity 
      FROM stock_move 
      WHERE consumed_for IS NOT NULL 
      GROUP BY to_char(DATE(create_date), 'YYYY-WW'), product_id 
     ) 
     as sub3 on (sub3.product_id=sub.product_id) 
     GROUP BY sub.product_id 
    ) 
+0

なぜ半年間のためのあなたのコードの作品は、あなたがそれを四半期ごとのために働いていなかった場合は?あなたのコードを投稿してください!あなたがそれを実行するとどうなりますか? – Robert

+0

yearOf(timestamp)、monthOf(timestamp)> 6のGROUPはどうですか?もちろんyearOfとmonthOf関数は大丈夫ではないので、ドキュメント内で動作する構文を見つけなければなりません。 – peterh

+0

質問を更新しました。今年は半年も同じようにしたいと思っています – user32876

答えて

2

あなたは日付項目はこれで発生する月の最初の日を取得することができます。

select last_day(datecolumn) + interval 1 day - interval 1 month 

あなたは、あなたがこの

のように半年間に数ヶ月の数(0-5)を得ることができます。この

select month(datecolumn) 

と日付項目の月を取得することができます

select (month(datecolumn) -1) mod 6 

だから、このように半年の初日を得ることができます。

select last_day(datecolumn) + interval 1 day - interval 1 month 
     - interval (month(datecolumn) -1) mod 6 month 

次に、この大きな表現をGROUP BYして、データをそのように要約できます。

また、これは動作します:

select last_day(datecolumn) + interval 1 day - interval 1 month 
     - interval (quarter(datecolumn) -1) mod 2 quarter 

トリックはそれが横たわる中で半年間の最初の日に任意の日時式を切り捨て表現を考え出すことです。

特定の年のものだけを処理したい場合は、このような操作を行います。

WHERE datecolumn >= DATE_FORMAT(NOW(), '%y-01-01') - INTERVAL 1 YEAR 
    AND datecolumn > DATE_FORMAT(NOW(), '%y-01-01') + INTERVAL 1 YEAR 

この特定の例では、表現DATE_FORMAT(someTimestampValue, '%y-01-01')は暦年の初めに日付または日時値を切り捨て暦年2015年と2016年のすべてを選択します。

+0

最後の12ヶ月間where句を追加することができますので、過去12ヶ月に基づいて結果が得られます – user32876

-1

ありMySQLでは何half_year機能はありませんが、あなたは四半期からそれを計算することができます。
階(四半期(date_column)/ 3) この1は3,4四半期の1,2四半期および1の場合は0を返します。

だから、半年間でグループへ:

GROUP BY year(date_column) + 0.1 * floor(quarter(date_column)/3) 
+0

ようこそ!このコードスニペットをご利用いただき、ありがとうございます。適切な説明(* meta.stackexchange.com/q/114762)は、*なぜ*これが問題の良い解決策であるかを示すことで長期的な価値を向上させ、将来の読者にとって他の同様の質問。あなたの前提を含め、あなたの答えを[編集]して説明を加えてください。 –

+0

これは質問に対する答えを提供しません。十分な[評判](https://stackoverflow.com/help/whats-reputation)があれば、[投稿にコメントする]ことができます(https://stackoverflow.com/help/privileges/comment)。代わりに、[質問者からの明確化を必要としない回答を提供する](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- i-do-代わりに)。 - [レビューの投稿](レビュー/低品質の投稿/ 18960196) –

+0

ありがとう!私は私の答えを明確に編集した –

関連する問題