2010-06-25 44 views
7

我有一個細節表列:MySQL的轉換多個行成列的單排

  • 的user_id INT
  • 代碼INT
  • 值INT

,我想建總結表如下:

  • user_id int
  • 值a詮釋
  • VALUEB詮釋

詳細信息表中,值a將對應地說,碼5,和valueB將對應的說法,代碼6,所以我要找的東西,如:

插入摘要(user_id,valueA,valueB)VALUES(SELECT ???來自細節);

問題當然是,我正在查看「詳細信息」表中的多行以填充「摘要」表中的一行。

例如,如果我有詳細以下行:

1 5 100 
1 6 200 
2 5 1000 
2 6 2000 

我想在彙總表如下落得:

1 100 200 
2 1000 2000 

任何想法?

+0

5個問題,不接受答案,0回答其他人的問題。你知道這是一個社區驅動的網站,而不是公司的支持論壇,對嗎? – Anax 2010-06-25 22:59:13

回答

8

MySQL沒有PIVOT/UNPIVOT的語法,這讓你使用GROUP BY和CASE表達式的組合:

INSERT INTO SUMMARY 
    (user_id,valueA,valueB) 
    SELECT d.user_id, 
     MAX(CASE WHEN d.code = 5 THEN d.value ELSE NULL END), 
     MAX(CASE WHEN d.code = 6 THEN d.value ELSE NULL END), 
    FROM DETAILS d 
GROUP BY d.user_id 
+0

這是我發現最有用的答案。我有一個巨大的桌子來處理,而且這個表現足夠。 – Jack 2010-07-02 22:03:28

+0

太棒了,這是我正在尋找的,我的SQL之一。謝謝! – hese 2011-06-02 15:27:44

+0

Fantasic,修改了這部分:MAX(CASE WHEN d.code = 5 THEN d.value ELSE NULL END)返回一個bool值,以確定用戶的類別是否與給定的搜索類別完全匹配,或者這兩個類別是否共享一個公共父類別。 – nealio82 2012-08-22 08:03:22

0

如果你有一組可管理代碼(比如只有5和6)你可以做這樣的事情:

SELECT details.user_id, code5.value, code6.value 
FROM details JOIN 
    (SELECT user_id, value FROM details WHERE code = 5) AS code5 USING(user_id) 
    JOIN 
    (SELECT user_id, value FROM details WHERE code = 6) AS code6 USING(user_id); 

您可能需要修改JOIN小號取決於如果你的代碼不需要爲1對1關係(即LEFT JOIN s)。

如果您有大量的代碼,我會查看一個遊標,在您的代碼的結果集或使用不同的技術(即PHP腳本)上運行上面的類似查詢。

2
insert into summary (user_id,valueA,valueB) 
SELECT a.user_id, a.value, b.value 
from details a 
join details b on a.user_id = b.user_id 
WHERE a.code = 5 and b.code = 6; 

要小心:如果user_id +代碼不是唯一的,您將最終得到多個彙總列。

編輯:

insert into summary (user_id,valueA,valueB) 
select u.user_id, ifnull(a.value,0), ifnull(b.value,0) 
from (select distinct user_id from details /* where code in (5,6) */) u 
left join details a on a.user_id = u.user_id and a.code = 5 
left join details b on b.user_id = u.user_id and b.code = 6 
+0

謝謝!但我實際上需要3個值,並且我以「明顯」的方式修改了上面的內容(添加了另一個連接),並且工作正常;但現在我遇到的問題是,如果任何用戶缺少任何行(例如,有A和B,但缺少C),那麼我最終不會爲該用戶創建行。相反,我希望看到一行爲0的細節表中的任何缺失值。有關於此的任何想法? – Jack 2010-06-25 23:29:47

+0

然後使用左連接,請參閱「編輯」 – 2010-06-26 07:50:34