MYSQL多行合并成一行多列

yang2028 2016-03-20 01:37:26
原数据:
id code name value
----------- ---------- --------
1 2014000 A 10
2 2014000 B 9
3 2014001 C 100
4 2014002 D 4
5 2014002 E 5
6 2014003 F 9
7 2014003 G 10

期望结果:
code name1 value1 name2 value2
----------- --------- --------- --------- ---------
2014000 A 10 B 9
2014001 C 100 null null
2014002 D 4 E 5
2014003 F 9 G 10



注意:同1个ID最多只2条记录,会出现相同value。
...全文
1339 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
itkobeliu 2016-08-22
  • 打赏
  • 举报
回复
引用 7 楼 mingqing6364 的回复:
[quote=引用 6 楼 yang2028 的回复:] 不是,ID小的放name1,ID大的放name2,是code是一件商品,有两个颜色和两个价格,做一一对应
按#4楼的写法,name和value已经对应了 一个code一条记录,ID小的放name1、value1,ID大的放name2,value2 已经对应起来了,我在mysql中测试过了,你看看吧 如果你要求name小的放name1,大的放name2 或者value小的放name1,大的放name2, 那就会麻烦很多,所以主键ID是很必要的[/quote] 一个商品的种类只有两个么????方法有点局限性吧
yang2028 2016-03-20
  • 打赏
  • 举报
回复
d code name value ----------- ---------- -------- 1 2014000 红色 10元 2 2014000 黄色 9元 3 2014001 标准 100元 4 2014002 大盒 大盒 5 2014002 小盒 5 元 跟name和value的大小值没关系,只是code的 2014000这个商品有两种规格,每一种规格一个价钱,红色就是10元,黄色就是9元,所以结果应该是: code name1 value1 name2 value2 ----------- --------- --------- --------- --------- 2014000 红色 10元 黄色 9元 2014001 标注 100元 null null 2014002 大盒 4元 小盒 5元
mingqing6364 2016-03-20
  • 打赏
  • 举报
回复
引用 6 楼 yang2028 的回复:
不是,ID小的放name1,ID大的放name2,是code是一件商品,有两个颜色和两个价格,做一一对应
按#4楼的写法,name和value已经对应了 一个code一条记录,ID小的放name1、value1,ID大的放name2,value2 已经对应起来了,我在mysql中测试过了,你看看吧 如果你要求name小的放name1,大的放name2 或者value小的放name1,大的放name2, 那就会麻烦很多,所以主键ID是很必要的
yang2028 2016-03-20
  • 打赏
  • 举报
回复
不是,ID小的放name1,ID大的放name2,是code是一件商品,有两个颜色和两个价格,做一一对应
mingqing6364 2016-03-20
  • 打赏
  • 举报
回复
上面这条语句是根据code分组,ID排序,ID小的放name1,ID大的放name2,你是这个意思不?
mingqing6364 2016-03-20
  • 打赏
  • 举报
回复
引用 2 楼 yang2028 的回复:
结果不对啊,应该是。 每一条数据的name和value都是一一对应的。
SELECT
	T1.code,
	T2.name AS name1,
	T2.value AS value1,
	T3.name AS name2,
	T3.value AS value2
FROM
(
	SELECT code,MIN(ID) AS ID1,CASE COUNT(code) WHEN 1 THEN NULL ELSE MAX(ID) END AS ID2 FROM T GROUP BY code
) T1
LEFT JOIN T T2 ON T1.ID1 = T2.ID
LEFT JOIN T T3 ON T1.ID2 = T3.ID
yang2028 2016-03-20
  • 打赏
  • 举报
回复
需求是这样,就比如2014000这个商品编号, A颜色是10元,B颜色是9元,在一行显示出来,所有name和value都是一一对应的。
yang2028 2016-03-20
  • 打赏
  • 举报
回复
结果不对啊,应该是


每一条数据的name和value都是一一对应的。
mingqing6364 2016-03-20
  • 打赏
  • 举报
回复
CREATE TABLE # (ID INT, code INT, NAME CHAR(1), VALUE VARCHAR(10))
INSERT INTO # VALUES
(1,2014000,'A','10'),
(2,2014000,'B','9'),
(3,2014001,'C','100'),
(4,2014002,'D','4'),
(5,2014002,'E','5'),
(6,2014003,'F','9'),
(7,2014003,'G','10')

SELECT
code,MIN(name) AS name1,MIN(CAST(REPLACE(value,' ','') AS INT)) AS value1,
CASE COUNT(ID) WHEN 1 THEN NULL ELSE MAX(name) END AS name2,
CASE COUNT(ID) WHEN 1 THEN NULL ELSE MAX(CAST(REPLACE(value,' ','') AS INT)) END AS value2
FROM
#
GROUP BY
code

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧