SQL多行合并一行多列

时间:2022-10-25 10:26:34
原数据:
       ID           name            value
-----------      ----------        --------  
2014000          A                         1
2014000          B                         2
2014001          C                        3  
2014002          D                       4
2014002          E                        5 

期望结果:
       ID           name1            value1           name2            value2
-----------       ---------              ---------          ---------              ---------   
2014000          A                       1                   B                    2
2014001          C                       3                   null               null
2014002         D                       4                   E                     5


注意:查询效率上要求比较快

11 个解决方案

#1



SELECT
ID,MIN(name) AS name1,MIN(value) AS value1,MAX(name) AS name2,MAX(value) AS value2
FROM
TABLENAME
GROUP BY
ID

#2


之前的回复是我考虑不周,以这个为准

SELECT
ID,MIN(name) AS name1,MIN(value) AS value1,
CASE COUNT(ID) = 1 THEN NULL ELSE MAX(name) END AS name2,
CASE COUNT(ID) = 1 THEN NULL ELSE MAX(value) END AS value2
FROM
TABLENAME
GROUP BY
ID

#3


我真不是故意的,用记事本写SQL就是天生会出错。。。 SQL多行合并一行多列

SELECT
ID,MIN(name) AS name1,MIN(value) AS value1,
CASE COUNT(ID) WHEN 1 THEN NULL ELSE MAX(name) END AS name2,
CASE COUNT(ID) WHEN 1 THEN NULL ELSE MAX(value) END AS value2
FROM
TABLENAME
GROUP BY
ID

#4


    ID           name1            value1           name2            value2
-----------       ---------              ---------          ---------              ---------   
2014000          A                       2                   B                   1
2014001          C                       3                   null               null
2014002         D                      5                 E                     4


为什么查出来数据结果不对 ,应该是
      ID           name1            value1           name2            value2
-----------       ---------              ---------          ---------              ---------   
2014000          A                       1                   B                    2
2014001          C                       3                   null               null
2014002         D                       4                   E                     5

#5


引用 4 楼 yang2028 的回复:
    ID           name1            value1           name2            value2
-----------       ---------              ---------          ---------              ---------   
2014000          A                       2                   B                   1
2014001          C                       3                   null               null
2014002         D                      5                 E                     4


为什么查出来数据结果不对 ,应该是
      ID           name1            value1           name2            value2
-----------       ---------              ---------          ---------              ---------   
2014000          A                       1                   B                    2
2014001          C                       3                   null               null
2014002         D                       4                   E                     5


我怀疑你的value列中有空格或者特殊字符,针对有空格的情况如下处理

/*
2014000 A 1
2014000 B 2
2014001 C 3  
2014002 D 4
2014002 E 5
*/

CREATE TABLE # (ID INT,NAME CHAR(1),VALUE VARCHAR(10))
INSERT INTO # VALUES
(2014000,'A','1'),
(2014000,'B',' 2'),
(2014001,'C','3'),
(2014002,'D','4'),
(2014002,'E','5')

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

SQL多行合并一行多列

#6


什么数据库?

同1个ID最多只2条记录?会不会出现name或value相同的情况?

#7


谢谢了,好了,请问下为什么要给加MIN和MAX函数

#8


name不会,但是value会有相同的,这种情况会有问题?

#9


mysql数据库

#10


应该说你描述的不够准确,你想要达到什么目的没有说明白
每组相同的ID最多会有几个,如果有N列,结果集是否需要2N+1列还是仅仅要求5列?
所以我就按照你的题面最简意思来写的SQL
即如此理解:结果集的5列分别理解为ID,name的最小值,value的最小值,name的最大值,value的最大值

#11


如果同一个id大于2条记录怎么写呢

#1



SELECT
ID,MIN(name) AS name1,MIN(value) AS value1,MAX(name) AS name2,MAX(value) AS value2
FROM
TABLENAME
GROUP BY
ID

#2


之前的回复是我考虑不周,以这个为准

SELECT
ID,MIN(name) AS name1,MIN(value) AS value1,
CASE COUNT(ID) = 1 THEN NULL ELSE MAX(name) END AS name2,
CASE COUNT(ID) = 1 THEN NULL ELSE MAX(value) END AS value2
FROM
TABLENAME
GROUP BY
ID

#3


我真不是故意的,用记事本写SQL就是天生会出错。。。 SQL多行合并一行多列

SELECT
ID,MIN(name) AS name1,MIN(value) AS value1,
CASE COUNT(ID) WHEN 1 THEN NULL ELSE MAX(name) END AS name2,
CASE COUNT(ID) WHEN 1 THEN NULL ELSE MAX(value) END AS value2
FROM
TABLENAME
GROUP BY
ID

#4


    ID           name1            value1           name2            value2
-----------       ---------              ---------          ---------              ---------   
2014000          A                       2                   B                   1
2014001          C                       3                   null               null
2014002         D                      5                 E                     4


为什么查出来数据结果不对 ,应该是
      ID           name1            value1           name2            value2
-----------       ---------              ---------          ---------              ---------   
2014000          A                       1                   B                    2
2014001          C                       3                   null               null
2014002         D                       4                   E                     5

#5


引用 4 楼 yang2028 的回复:
    ID           name1            value1           name2            value2
-----------       ---------              ---------          ---------              ---------   
2014000          A                       2                   B                   1
2014001          C                       3                   null               null
2014002         D                      5                 E                     4


为什么查出来数据结果不对 ,应该是
      ID           name1            value1           name2            value2
-----------       ---------              ---------          ---------              ---------   
2014000          A                       1                   B                    2
2014001          C                       3                   null               null
2014002         D                       4                   E                     5


我怀疑你的value列中有空格或者特殊字符,针对有空格的情况如下处理

/*
2014000 A 1
2014000 B 2
2014001 C 3  
2014002 D 4
2014002 E 5
*/

CREATE TABLE # (ID INT,NAME CHAR(1),VALUE VARCHAR(10))
INSERT INTO # VALUES
(2014000,'A','1'),
(2014000,'B',' 2'),
(2014001,'C','3'),
(2014002,'D','4'),
(2014002,'E','5')

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

SQL多行合并一行多列

#6


什么数据库?

同1个ID最多只2条记录?会不会出现name或value相同的情况?

#7


谢谢了,好了,请问下为什么要给加MIN和MAX函数

#8


name不会,但是value会有相同的,这种情况会有问题?

#9


mysql数据库

#10


应该说你描述的不够准确,你想要达到什么目的没有说明白
每组相同的ID最多会有几个,如果有N列,结果集是否需要2N+1列还是仅仅要求5列?
所以我就按照你的题面最简意思来写的SQL
即如此理解:结果集的5列分别理解为ID,name的最小值,value的最小值,name的最大值,value的最大值

#11


如果同一个id大于2条记录怎么写呢