Oracle SQL-更改记录演示
我可以从以下位置更改“选择录制演示文稿”:Oracle SQL-更改记录演示,sql,oracle,plsql,Sql,Oracle,Plsql,我可以从以下位置更改“选择录制演示文稿”: Ticket Colour 12321 Green 12321 Blue 12321 Yellow 22653 Red 22653 Black 致: 我建议在这里使用listag: SELECT Ticket, LISTAGG(Colour, ',') WITHIN GROUP (ORDER BY Colour) AS Colours FROM yourTable GROUP BY Ticket;
Ticket Colour
12321 Green
12321 Blue
12321 Yellow
22653 Red
22653 Black
致:
我建议在这里使用
listag
:
SELECT
Ticket,
LISTAGG(Colour, ',') WITHIN GROUP (ORDER BY Colour) AS Colours
FROM yourTable
GROUP BY Ticket;
Ticket Colours
12321 Blue,Green,Yellow
22653 Black,Red
我建议这样做的原因是,您的数据集最终可能会有3列以上。动态SQL可能会帮助您解决这个问题,但这需要大量的工作。我建议您在此处使用
listag
:
SELECT
Ticket,
LISTAGG(Colour, ',') WITHIN GROUP (ORDER BY Colour) AS Colours
FROM yourTable
GROUP BY Ticket;
Ticket Colours
12321 Blue,Green,Yellow
22653 Black,Red
create table ex(
no number,
colour varchar(20));
insert into ex values(12321, 'Green');
insert into ex values(12321 , 'Blue');
insert into ex values(12321 , 'Yellow');
insert into ex values(22653 , 'Red');
insert into ex values(22653 , 'Black');
select * from ex;
SELECT LISTAGG(colour, ', ') WITHIN GROUP (ORDER BY no)
FROM ex group by no;
我建议这样做的原因是,您的数据集最终可能会有3列以上。动态SQL可能会帮助您解决这个问题,但这需要大量的工作
create table ex(
no number,
colour varchar(20));
insert into ex values(12321, 'Green');
insert into ex values(12321 , 'Blue');
insert into ex values(12321 , 'Yellow');
insert into ex values(22653 , 'Red');
insert into ex values(22653 , 'Black');
select * from ex;
SELECT LISTAGG(colour, ', ') WITHIN GROUP (ORDER BY no)
FROM ex group by no;
输出
12321 Blue, Green, Yellow
22653 Black, Red
输出
12321 Blue, Green, Yellow
22653 Black, Red
如果需要多列,可以使用条件聚合:
select ticket,
max(case when seqnum = 1 then colour end) as colour_1,
max(case when seqnum = 2 then colour end) as colour_2,
max(case when seqnum = 3 then colour end) as colour_3
from (select t.*,
row_number() over (partition by ticket order by ticket) as seqnum
from t
) t
group by ticket;
我应该注意的是,颜色的顺序是不能保证的。SQL表表示无序集,因此除非另一列指定排序,否则没有排序。如果需要多列,可以使用条件聚合:
select ticket,
max(case when seqnum = 1 then colour end) as colour_1,
max(case when seqnum = 2 then colour end) as colour_2,
max(case when seqnum = 3 then colour end) as colour_3
from (select t.*,
row_number() over (partition by ticket order by ticket) as seqnum
from t
) t
group by ticket;
我应该注意的是,颜色的顺序是不能保证的。SQL表表示无序集,因此除非另一列指定排序,否则没有排序。可以。只需检查Oracleuse Listag函数中的动态数据透视就可以了。只需检查Oracleuse Listag函数中的动态数据透视就可以了Gordon,我收到了同样的消息,我也反驳了你的观点。@GordonLinoff可能使用
t
作为源表名和子查询别名导致了这种情况?只是一个天真的猜测。至少看不到任何其他可能的原因:)@TimBiegeleisen。连续向下投票。干杯。戈登,我收到了同样的消息,我也反驳了你的。@GordonLinoff可能是使用t
作为源表名和子查询别名造成的?只是一个天真的猜测。至少看不到任何其他可能的原因:)@TimBiegeleisen。连续向下投票。干杯