如何写sql语句在一行中有相同的ID

时间:2016-03-15 13:19:30

标签: sql database oracle

我有一个问题,我们如何编写sql语句:

我有这个:

id        name       color
 1         A          blue
 3         D          pink
 1         C          grey
 3         F          blue
 4         E          red

我希望我的结果是这样的:

id        name    name    color     color
 1        A        C      blue       grey
 3        D        F      pink       blue
 4        E               red

我如何在SQL中执行此操作? 非常感谢您的帮助

谢谢

3 个答案:

答案 0 :(得分:2)

查询 - 将值连接到单个列

SELECT ID,
       LISTAGG( Name,  ',' ) WITHIN GROUP ( ORDER BY ROWNUM ) AS Names,
       LISTAGG( Color, ',' ) WITHIN GROUP ( ORDER BY ROWNUM ) AS Colors
FROM   table_name
GROUP BY ID;

<强>输出

ID Names Colors
-- ----- ---------
 1 A,C   blue,grey
 3 D,F   pink,blue
 4 E     red

查询 - 如果您有固定的最大值数

SELECT ID,
       MAX( CASE rn WHEN 1 THEN name  END ) AS name1,
       MAX( CASE rn WHEN 1 THEN color END ) AS color1,
       MAX( CASE rn WHEN 2 THEN name  END ) AS name2,
       MAX( CASE rn WHEN 2 THEN color END ) AS color2
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER ( PARTITION BY id ORDER BY ROWNUM ) AS rn
  FROM   table_name t
)
GROUP BY id;

<强>输出

ID Name1 Color1 Name2 Color2
-- ----- ------ ----- ------
 1 A     blue   C     grey
 3 D     pink   F     blue
 4 E     red

答案 1 :(得分:1)

你想要实现的目标存在根本问题 - 你不知道每个id的名称(/颜色)有多少值 - 所以你不知道输出应该有多少列.... 。 解决方法是将每个id的所有名称(和颜色)保存在一列中:

select id,group_concat(name),group_concat(color) from tblName group by id

答案 2 :(得分:0)

@ MT0的答案工作得很好,还有另一个选择是使用pivot,还有SQL语句:

SELECT * 
FROM
(
SELECT id, name, color
FROM table 

WHERE  -clause where-
 )
PIVOT 
(
max(color)
FOR name in ('A','D','E') 
 ) ;

谢谢