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。
...全文
1418 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

源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 ### Home Bus 协议概述 Home Bus协议,亦被称为家庭总线协议,是由日本研发的一种专门应用于家庭自动化领域的通信标准。该协议在商用空调及其他家用电器的远程操控方面具备广泛的应用范围。借助Home Bus协议,设备之间能够达高效的通信,使用户能够更加便利地监管家庭中的各类智能设备。 ### ECHONET协议及其背景 Home Bus协议与ECHONET协议存在紧密的联系,实际上,ECHONET代表了一种更为具体的技术规范,其目的在于为家庭自动化领域构建一个开放且统一的通信标准。ECHONET由ECHONET财团负责维护与支持,该组织致力于推动该协议的进步与标准化进程。ECHONET协议的应用范围不仅限于家庭环境,还包括了楼宇自动化以及工业自动化等多个领域。 #### ECHONET的历史版本及修订记录 - **Version 1.0**:发布于2000年3月18日,同年7月对联盟员公开,最终于同年对公众发布。 - **Version 1.01**:在2001年5月23日,向联盟员发布,主要进行了补充和勘误工作。 - **Version 2.00**:2001年8月7日,针对联盟员发布。此版本中将电源线A和电源线B两种方式合并为单一电源线方式(基于电源线A),并对相关描述进行了调整。 - **Version 2.01**:2001年11月9日,进行了一些必要的修正,包括排版错误的修正、术语的标准化等。 - **Version 2.10**:经历预览版和草案阶段后,于2002年3月7日正式对联盟员开放。此次更新主要涉及第3部分关于状态转换的描述修改。 -...

22,296

社区成员

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

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