2010-06-25 35 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