[英]mysql converting multiple rows into columns in a single row
我有一个列的详细信息表:
我想构建一个如下所示的汇总表:
在详细信息表中,valueA对应于say,代码5,valueB对应于say,代码6,所以我正在寻找类似的东西:
插入摘要(user_id,valueA,valueB)VALUES(SELECT from from details);
问题当然是我正在查看“详细信息”表中的多行以填充“摘要”表中的一行。
例如,如果我有详细的以下行:
1 5 100
1 6 200
2 5 1000
2 6 2000
我想在摘要表中得到以下结果:
1 100 200
2 1000 2000
有任何想法吗?
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
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
如果你有一套可管理的代码(例如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
)。
如果你有一大堆代码,我会调查一个游标在你的代码的结果集上运行一个类似的查询或使用不同的技术(即PHP脚本)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.