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将行动态转换为列数据的主要内容,如果未能解决你的问题,请参考以下文章