2013-07-20 57 views
2

我在用MySQL選擇查詢完成某些操作時遇到了麻煩。我有一個統計表,由一個字母數字ID列,一個yearID列和一系列其他各列組成,表示在指定年份發生了多少次事件。就像這樣:MySQL:將逐年的行轉換爲列?

personID yearID event1 event2 event3 
person1  1999  12  15  2 
person1  2000  14  7  3 
person1  2001  25  10  2 
person2  1999  16  12  1 
person2  2000  15  14  1 
person2  2001  9  20  2 

我嘗試使用select得到以下欄目:

personID event1_1999 event1_2000 event1_2001 event2_1999 event2_2000 etc... 

,所以我使用這種類型的代碼:

select 
personID, 
if(year_ID = "1999",event1,NULL) AS event1_1999, 
if(year_ID = "2000",event1,NULL) AS event1_2000, 
if(year_ID = "2000",event1,NULL) AS event1_2001, 
etc. 

我發現在結果不幸的是,只有與第一年相對應的列(例如,event1_1999,event2_1999等)才包含任何數據,其餘都爲null。我無法弄清楚這是爲什麼,或者解決它的一種方法。誰能幫忙?

感謝

+0

這是問題的常見類型,SO搜索「MySQL的樞軸」。你會發現很多。 – Barmar

+0

謝謝 - 我看到了一種技術來完成這項工作,但我還沒有明白爲什麼我的技術失敗。那裏有什麼見解? –

+0

@JohnC:你還沒有發佈你的技術,所以這是不可能回答的:你的技術失敗的原因將取決於你的技術*是什麼*。 (例如,您的查詢是否使用了「GROUP BY」?無論是否使用GROUP BY,任何一種方式都會失敗,但出於不同的原因。)如果發佈使用您的技術的*完整*查詢,則您有更好的機會得到答案。 – ruakh

回答

0

...我看到了如下技術:讓現在這個做,但我還不明白爲什麼我的技術沒。任何瞭解嗎?...

你必須使用一個聚合函數(SUM()MIN()MAX()根據您的需要)和GROUP BY

嘗試

SELECT personid, 
     SUM(CASE WHEN yearID = 1999 THEN event1 ELSE 0 END) event1_1999, 
     SUM(CASE WHEN yearID = 2000 THEN event1 ELSE 0 END) event1_2000, 
     SUM(CASE WHEN yearID = 2001 THEN event1 ELSE 0 END) event1_2001 
    FROM Table1 
GROUP BY personid 

同樣的事情,但隨着IF

SELECT personid, 
     SUM(IF(yearID = 1999, event1, 0)) event1_1999, 
     SUM(IF(yearID = 2000, event1, 0)) event1_2000, 
     SUM(IF(yearID = 2001, event1, 0)) event1_2001 
    FROM Table1 
GROUP BY personid 

輸出在這兩種情況下

 
| PERSONID | EVENT1_1999 | EVENT1_2000 | EVENT1_2001 | 
------------------------------------------------------ 
| person1 |   12 |   14 |   25 | 
| person2 |   16 |   15 |   9 | 

這裏是SQLFiddle演示

UPDATE要缺席數據

SELECT personid, 
     SUM(CASE WHEN yearID = 1999 THEN event1 END) event1_1999, 
     SUM(CASE WHEN yearID = 2000 THEN event1 END) event1_2000, 
     SUM(CASE WHEN yearID = 2001 THEN event1 END) event1_2001 
    FROM Table1 
GROUP BY personid; 

SELECT personid, 
     SUM(IF(yearID = 1999, event1, NULL)) event1_1999, 
     SUM(IF(yearID = 2000, event1, NULL)) event1_2000, 
     SUM(IF(yearID = 2001, event1, NULL)) event1_2001 
    FROM Table1 
GROUP BY personid; 

樣本輸出的情況下得到NULL S:

 
| PERSONID | EVENT1_1999 | EVENT1_2000 | EVENT1_2001 | 
------------------------------------------------------ 
| person1 |   12 |   14 |   25 | 
| person2 |   16 |   15 |   9 | 
| person3 |   3 |  (null) |  (null) | 

這裏是SQLFiddle演示

+0

那麼,那麼聚合器的缺乏就是問題所在。我已經使用personID組,但沒有提及它。零是一些值的可能性 - 將NULL用於您使用的任何示例? –

+0

對不起 - 我在發佈我的第一個問題後不久就被派去跑腿,所以我還沒有機會嘗試它。我之前的評論也是自動更正的,所以我想問的是:原始表中的一些值可能爲零,因此將if或case語句的結果作爲零將不起作用。我可以使用NULL嗎?如果沒有,我想我會需要使用一些蠻橫的,不可能的巨大價值。 –

+0

@JohnC看到更新的答案和一個新的sqlfiddle演示 – peterm