我有一个问题,我们如何编写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中执行此操作? 非常感谢您的帮助
谢谢
答案 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')
) ;
谢谢