1

データを含むいくつかのテーブルがあり、次の形式でピボットのようなテーブルを生成しようとしています:

エリア | タイプ | 2013-08-25 | 2013-08-26 | 2013-08-27 など.
南 | 南 | 赤 | 赤 | 5 | 2 | 9
北 | 北 | ブルー | ブルー | 3 | 0 | 7

現在、これを生成するために、PHP を使用して各日付をループし、指定された開始日と終了日に基づいて各日付の sum(if ステートメントを生成しています。

以前にクエリを実行して日付ごとにグループ化し、PHP で組み立てることができることはわかっていますが、SQL ソリューションはそれよりも簡単に思えます。

これは私がやろうとしていることを達成するための最良の方法ですか、それとも私が見逃している別の簡単な方法はありますか?

クエリの例:

SELECT 
iw.display_name as Area, 
iet.type as 'Type', 
sum(if(date(iac.created_at) = '2013-08-25',1,0)) as '2013-08-25', 
sum(if(date(iac.created_at) = '2013-08-26',1,0)) as '2013-08-26', 
sum(if(date(iac.created_at) = '2013-08-27',1,0)) as '2013-08-27', 
sum(if(date(iac.created_at) = '2013-08-28',1,0)) as '2013-08-28', 
sum(if(date(iac.created_at) = '2013-08-29',1,0)) as '2013-08-29', 
sum(if(date(iac.created_at) = '2013-08-30',1,0)) as '2013-08-30', 
sum(if(date(iac.created_at) = '2013-08-31',1,0)) as '2013-08-31',  
count(iac.id) as total 
FROM iac
JOIN ioc on ioc.id = iac.ioc_id
JOIN iet on iet.id = ioc.iet_id
JOIN iw  on  iw.id = iac.iw_id
WHERE date(iac.created_at) between '2013-08-25' and '2013-08-31'
GROUP BY iw.id, iet.id
ORDER BY iw.display_name, iet.type
4

2 に答える 2

1

あなたの方法は問題ありません。条件を削除することで (MySQL を使用しているため) 単純化できますif1ブール値はtrue および0falseとして扱われます。

SELECT iw.display_name as Area, iet.type as `Type`, 
       sum(date(iac.created_at) = '2013-08-25') as `2013-08-25`, 
       sum(date(iac.created_at) = '2013-08-26') as `2013-08-26`, 
       sum(date(iac.created_at) = '2013-08-27') as `2013-08-27`, 
       sum(date(iac.created_at) = '2013-08-28') as `2013-08-28`, 
       sum(date(iac.created_at) = '2013-08-29') as `2013-08-29`, 
       sum(date(iac.created_at) = '2013-08-30') as `2013-08-30`, 
       sum(date(iac.created_at) = '2013-08-31') as `2013-08-31`,  
       count(iac.id) as total 
FROM iac
JOIN ioc on ioc.id = iac.ioc_id
JOIN iet on iet.id = ioc.iet_id
JOIN iw  on  iw.id = iac.iw_id
WHERE iac.created_at >= date('2013-08-25') and iac.created_at < date('2013-09-01')
GROUP BY iw.id, iet.id
ORDER BY iw.display_name, iet.type;

また、列の別名の一重引用符を逆引用符に置き換えました。文字列定数には一重引用符のみを使用してください。

また、日付ロジックを不等式に置き換えました。これにより、列の周りの関数呼び出し ( date()) が削除され、このフィルタリングにインデックスが使用される可能性が高くなります。

于 2013-08-29T01:37:58.377 に答える