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

Posted

技术标签:

【中文标题】ANSI sql将行动态转换为列数据【英文标题】:ANSI sql to dynamically convert rows into column data 【发布时间】:2015-01-19 13:33:21 【问题描述】:

我有如下动态输入数据

   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;

第二步:更新如下。

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

现在,临时表将具有上述输出... 但我需要的是,是否有在不使用临时表(单个查询)的情况下带来此输出..

【问题讨论】:

你的答案在这里***.com/questions/194852/…。下次试试谷歌 使用|| 进行字符串连接强烈建议使用Oracle。我正在删除其他数据库标签。当然,如果不合理,OP 可以添加正确的标志。 @Jaques:谢谢。但我需要 ANSI 标准格式。他们正在使用一些内置功能来实现这一点。,. 为什么需要 ANSI 标准?你会在多个数据库上使用它? @Mihai:是的。我需要可以在任何 RDBMS 上运行的通用查询 【参考方案1】:

可以试试这个:

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

【讨论】:

那个 group_concat 是什么? 好的,我看到你标记了错误的标签。上面的代码适用于mysql。这里类似于 oracle 中的 group_concat:***.com/questions/16771086/…【参考方案2】:

在 Oracle 中,您将使用 listagg():

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

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

【讨论】:

谢谢 gordon.. 但我不想使用任何内置函数。像 listagg .. 是否有任何通用的 ANSI 标准 SQL? 还有一件事,你认为,无论我使用UPDATE 查询所做的一切都是正确的吗? 我使用临时表的查询有什么问题? 请帮我找出我使用临时表的查询出了什么问题。我需要了解是否有任何问题。然后我也会使用你建议的内置查询 @logan 。 . .一行是否有最大元素数?

以上是关于ANSI sql将行动态转换为列数据的主要内容,如果未能解决你的问题,请参考以下文章

Mysql查询根据两列动态将行转换为列

PostgreSQL 将行动态转置为列

SQL Server试图将数据从行转换为列

使用 SQL 将 json 数据列表字段转换为列

使用 SQL 将数据从行转换为列

MS Access SQL 将行转换为列