MYSQL多行合并成一行多列

时间:2022-11-29 10:28:30
原数据:
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。

9 个解决方案

#1


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

MYSQL多行合并成一行多列

#2


结果不对啊,应该是 MYSQL多行合并成一行多列


每一条数据的name和value都是一一对应的。

#3


需求是这样,就比如2014000这个商品编号, A颜色是10元,B颜色是9元,在一行显示出来,所有name和value都是一一对应的。

#4


引用 2 楼 yang2028 的回复:
结果不对啊,应该是 MYSQL多行合并成一行多列


每一条数据的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

#5


上面这条语句是根据code分组,ID排序,ID小的放name1,ID大的放name2,你是这个意思不?

#6


不是,ID小的放name1,ID大的放name2,是code是一件商品,有两个颜色和两个价格,做一一对应

#7


引用 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是很必要的

#8


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元

#9


引用 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是很必要的

一个商品的种类只有两个么????方法有点局限性吧

#1


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

MYSQL多行合并成一行多列

#2


结果不对啊,应该是 MYSQL多行合并成一行多列


每一条数据的name和value都是一一对应的。

#3


需求是这样,就比如2014000这个商品编号, A颜色是10元,B颜色是9元,在一行显示出来,所有name和value都是一一对应的。

#4


引用 2 楼 yang2028 的回复:
结果不对啊,应该是 MYSQL多行合并成一行多列


每一条数据的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

#5


上面这条语句是根据code分组,ID排序,ID小的放name1,ID大的放name2,你是这个意思不?

#6


不是,ID小的放name1,ID大的放name2,是code是一件商品,有两个颜色和两个价格,做一一对应

#7


引用 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是很必要的

#8


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元

#9


引用 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是很必要的

一个商品的种类只有两个么????方法有点局限性吧