ANSI sql动态地将行转换为列数据

时间:2014-11-21 11:52:47

标签: sql oracle ansi-sql

我有一个动态输入数据,如下所示

   Id  val
   --- -----
    10  A
    10  B
    11  A
    11  B
    11  C
    .   .
    .   .

我需要按照顺序打印它。

    Id  Val
   ---- ----
    10  A,B
    11  A,B,C

我需要编写单个查询来转换上述数据,而不使用任何内置函数。

我的尝试:我可以通过将数据填充到一些临时数据并更新记录来尝试这一点。

步骤1:尝试仅使用唯一的id列加载到临时数据,并将val作为null加载,如下所示。

create table temp as (select id, null as val from table group by id) with data;

步骤2:更新如下。

update temp t2 
set val=(case when t2.val is null then t1.val else t1.val || ',' t2.val end) from 
(select val from table t1 where t1.val= t2.val) t1

现在,临时表将具有以上输出... 但我需要的是,无论如何都要在不使用Temp表(单个查询)的情况下输出此输出..

2 个答案:

答案 0 :(得分:0)

可以试试这个:

select ID, group_concat(distinct value) as value
from table
group by ID

答案 1 :(得分:0)

在Oracle中,您将使用listagg()

select id, listagg(val, ',') within group (order by val)
from table t
group by id
order by id;

据我所知,没有ANSI标准机制来执行此操作。