2010-08-20 53 views
0

於是,想出了這個標題是很難的MySQL:查詢基於其他列的屬性數據進行排序

SELECT Date(p.born_at), SUM(p.value) as 'total_value_for_day' 
FROM puppies as p 
WHERE p.status = 2 
GROUP BY DATE(p.born_at); 

所以,這給出了一個2列結果。

我想是這樣的:

列:

date | status = 1 | status = 2 | status = 3 
DATA!!! 

是有辦法做到這一點?

+0

你能澄清你想要的結果?它看起來像你想要4列,第一列是日期,而對於後面三列,你想要匹配狀態的數據。例如,如果狀態= 3,則填充該列中的數據。那是對的嗎?如果你給出了一個帶有補充數據的示例輸出,它會真正澄清你的問題。 – dvanaria 2010-08-20 16:01:01

回答

1
SELECT Date(p.born_at), 
SUM(case when status = 1 then p.value end) as 'status = 1', 
SUM(case when status = 2 then p.value end) as 'status = 2', 
SUM(case when status = 3 then p.value end) as 'status = 3' 
FROM puppies as p 
WHERE p.status in(1,2,3) 
GROUP BY DATE(p.born_at); 
+0

使用WHERE還是不使用WHERE更好? – NullVoxPopuli 2010-08-20 16:09:14

+0

取決於你的數據!如果你有那些狀態不是1,2或3的行,那麼使用'WHERE'可能會避免處理不必要的行。如果所有行都有其中一個值,那麼最好刪除它以避免冗餘檢查。 – 2010-08-20 16:12:09

1
SELECT Date(born_at), 
    SUM(case when Status = 1 then value else 0 end) as 'status = 1', 
    SUM(case when Status = 2 then value else 0 end) as 'status = 2', 
    SUM(case when Status = 3 then value else 0 end) as 'status = 3' 
FROM puppies 
GROUP BY DATE(born_at); 
+0

使用WHERE還是不使用WHERE更好? – NullVoxPopuli 2010-08-20 16:16:36

+0

如果您有超過3種可能的狀態,我會使用WHERE子句。目前還不清楚你的問題...... – RedFilter 2010-08-20 16:24:26

+0

(正如馬丁已經說過:)) – RedFilter 2010-08-20 16:24:57

1
SELECT 
    DATE(p.born_at) 
    , SUM(CASE WHEN STATUS = 1 THEN p.value END) AS 'Status = 1' 
    , SUM(CASE WHEN STATUS = 2 THEN p.value END) AS 'Status = 2' 
    , SUM(CASE WHEN STATUS = 3 THEN p.value END) AS 'Status = 3' 
FROM puppies AS p 
WHERE p.status IN(1, 2, 3) 
GROUP BY DATE(p.born_at); 
相關問題