2017-01-11 5 views
0

MySQLは日/月テーブル/マトリックスを取得しますか?日付と値の簡単なテーブルで

+------------+-------+ 
| date  | count | 
+------------+-------+ 
| 2015-01-01 | 5  | 
| 2015-01-02 | 2  | 
| 2015-07-02 | 20 | 

どのように私は、単一のMySQLのクエリはおそらく副問い合わせを使用して参加して、値を使用して、行として列などすべての月のマトリックス、および日を得ることができますか?

+-----+----------+----------+--------- 
| Day | January | February | March... 
+-----+----------+----------+--------- 
| 1 | 5  | 8  | 12 
| 2 | 2  | 9  | 5 
| 3 | 5  | 12  | 6 

これはPHPやその他のスクリプトツールを使用しないと可能ですか?

これは、数ヶ月間の傾向とピークを視覚化するために使用されます。

+0

年はどうなりますか? – shmosel

+0

@Shadowこれは重複していません。この質問は、質問が書かれていることをよく前に、何ヶ月が何年あるかをよく知っています。 –

+0

@ lc。重複した質問への回答は、静的および動的の両方のピボットを示しています。 Plsは次に重複した質問を読む。 – Shadow

答えて

3

あなたは、本質的に持っていることはピボットで、あなたが条件付き合計(すなわち、それ場合とSUM)でこれを達成することができ、個々の行を取得するために、1日数によってグループ化:

select DAY(date) as Day, 
     sum(case when MONTH(date) = 1 then count else 0 end) as January, 
     sum(case when MONTH(date) = 2 then count else 0 end) as February, 
     --... 
     sum(case when MONTH(date) = 12 then count else 0 end) as December 
from myTable 
group by DAY(date) 
+0

ここは... upvoteを持っていますが、あなたのソリューションは(SUMを使っているので)すべての年を集計することに注意してください。 –

+0

@TimBiegeleisenあなたと同じですが、もちろん答えは1日に1行しかないと仮定します。だから我々はおそらく両方の権利と同時に両方の間違っている。 –

+0

さて、私は 'count'は既に特定の日(と年)の集計であると仮定しています。しかし私は間違っている可能性があります。 –

0

2015年の行列だけが必要な場合は、ピボットクエリを実行できます。

SELECT DATE_FORMAT(date, '%d') AS Day, 
     MAX(CASE WHEN DATE_FORMAT(date, '%m') = 1 THEN count END) AS January, 
     MAX(CASE WHEN DATE_FORMAT(date, '%m') = 2 THEN count END) AS February, 
     MAX(CASE WHEN DATE_FORMAT(date, '%m') = 3 THEN count END) AS March, 
     MAX(CASE WHEN DATE_FORMAT(date, '%m') = 4 THEN count END) AS April, 
     MAX(CASE WHEN DATE_FORMAT(date, '%m') = 5 THEN count END) AS May, 
     MAX(CASE WHEN DATE_FORMAT(date, '%m') = 6 THEN count END) AS June, 
     MAX(CASE WHEN DATE_FORMAT(date, '%m') = 7 THEN count END) AS July, 
     MAX(CASE WHEN DATE_FORMAT(date, '%m') = 8 THEN count END) AS August, 
     MAX(CASE WHEN DATE_FORMAT(date, '%m') = 9 THEN count END) AS September, 
     MAX(CASE WHEN DATE_FORMAT(date, '%m') = 10 THEN count END) AS October, 
     MAX(CASE WHEN DATE_FORMAT(date, '%m') = 11 THEN count END) AS November, 
     MAX(CASE WHEN DATE_FORMAT(date, '%m') = 12 THEN count END) AS December 
FROM yourTable 
WHERE DATE_FORMAT(date, '%Y') = '2015' 
GROUP BY DATE_FORMAT(col, '%d') 
関連する問題