2013-06-05 51 views
2

我試圖將結果拆分成不同的列,我一直在尋找那幾天,但找不到我想要做的正確術語。我可能使用了錯誤的關鍵詞。MySQL Select Where將結果拆分到不同的列

我有這樣的一個表:

Timestamp System Value 
1    1   13 
1    2   12 
1    3   5 
2    1   37 
2    2   12 
2    3   55 
3    1   12 
3    2   45 
3    3   45 

而且我希望得到的結果類似:

Timestamp, System1val, System2val, System3val 
1    13   12  5 
2    37   12  55 
3    12   45  45 

我敢肯定這是可能做到這一點。我一直在使用:

SELECT 
    FROM_UNIXTIME(timestamp) as time, 
    CASE System 
     WHEN '1' THEN System 
     END AS System1val, 
    CASE System 
     WHEN '2' THEN pyr.measure_conv 
     END AS System2val, 
    CASE System 
     WHEN '3' THEN pyr.measure_conv 
     END AS System3val 
FROM 

這實際上返回不同的字段並填充NULL值。最終目標是按時間戳分組,並具有所有三個值

+0

您正在查找的關鍵字是'pivot'。 –

回答

4

這是一個'交叉表'挑戰。你需要以這種方式構建的東西...

SELECT 
Timestamp, 
SUM(CASE WHEN System=X THEN Value ELSE 0 END) AS X, 
SUM(CASE WHEN System=Y THEN Value ELSE 0 END) AS Y 
FROM System 
GROUP BY Timestamp 
+0

事實上,它似乎有效,它是最有效的方式嗎? – Damien

+0

@Damien它應該是非常有效的。當你沒有像你的sql server的PIVOT那樣的行爲的功能時,那麼這就是「設計模式」,因爲它是最容易理解和緊湊的 - 據說這對於未知數量的值是不好的你想換位,但這是我在表現層處理的挑戰。 –

+0

我仍然有一個問題,有了這個結構,每個條目返回三次,因此總和返回值高三倍。我可以分三次,但它應該是一個更乾淨的方式去。 SUM塊使用groupby x和y可以解決這個問題。 – Damien

2

嘗試

SELECT 
    timestamp time, 
    SUM(CASE WHEN system = 1 THEN value ELSE NULL END) System1val, 
    SUM(CASE WHEN system = 2 THEN value ELSE NULL END) System2val, 
    SUM(CASE WHEN system = 3 THEN value ELSE NULL END) System3val 
FROM Table1 
GROUP BY timestamp 

輸出:

| TIME | SYSTEM1VAL | SYSTEM2VAL | SYSTEM3VAL | 
----------------------------------------------- 
| 1 |   13 |   12 |   5 | 
| 2 |   37 |   12 |   55 | 
| 3 |   12 |   45 |   45 | 

這裏是SQLFiddle演示