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。连续向下投票。干杯