2014-02-26 63 views
0

是否可以構建查詢以基於多個條件創建多個列並按時間聚合。例如一個簡單的表像這樣:根據where子句創建列

id value created 
1 45 datetime 
2 52 datetime 
3 24 datetime 
4 33 datetime 
5 20 datetime 

我可以得到10和20之間的所有值每一年的一週,像這樣:

SELECT count(*) as '10-20', week(created) as 'week', year(created) as 'year' 
FROM table 
WHERE value > 10 AND value < 20 
GROUP BY year(created), week(created) 

這會給我例如:

10-20 week year 
40 1 2014 
21 2 2014 
3  33 2014 

我可以重複查詢範圍20-30,30-40,40-50和手動加入輸出,但我想單個查詢將它們組合成一個表,所以th Ë輸出將是:

10-20 20-30 30-40 40-50 week year 
40 0  33 42 1 2014 
21 1  0  2  1 2014 
0  0  32 0  12 2014 
3  42 34 32 33 2014 
+1

這是一個「數據透視」,並且有很多例子。然而,一個更好的主意是隻需要像你一樣獲取結果集並在應用程序級別處理顯示邏輯(例如,使用簡單的PHP循環) – Strawberry

+0

如果你正在獲得,比如說只有3個選項(10,20 ,30周的範圍),你可以處理每個3個不同的查詢。 – jean

+0

我同意@Strawberry,這是PIVOT的理想情況,但它可以在DB中實現,那麼爲什麼還要打擾客戶端呢? – Ziouas

回答

1

您可以用SUM而不是COUNT,與IF總和的括號內

像這樣的事情

SELECT SUM(IF(value > 10 AND value < 20), 1, 0) as '10-20', 
     SUM(IF(value > 20 AND value < 30), 1, 0) as '20-30', 
     SUM(IF(value > 30 AND value < 40), 1, 0) as '30-40', 
     SUM(IF(value > 40 AND value < 50), 1, 0) as '40-50', 
week(created) as 'week', year(created) as 'year' 
FROM table 
WHERE 
GROUP BY year(created), week(created) 

注意,這裏有個問題(並在您的原始代碼中)的值爲邊界上的項目(例如,如果是20)。

靈活性聰明人,你很可能會與存儲範圍另一個表更好,加入該得到獲得每週/每年每範圍中的一行,然後打開行列在您的腳本。添加範圍時保存修改代碼。