用于将子行组合成单行视图的 SQL 查询
Posted
技术标签:
【中文标题】用于将子行组合成单行视图的 SQL 查询【英文标题】:SQL query to combine child rows into a single row view 【发布时间】:2021-07-29 09:09:30 【问题描述】:我有活动父表和活动子表。我需要一个 sql 查询来将键作为列名,将值作为列值作为单个父行。表格和结果如图所示。键和值将动态变化。谢谢
活动表
Activityid Activity Time
10 Activity1 Time1
11 Activity2 Time2
12 Activity3 Time3
13 Activity4 Time4
活动表
Activityid key value
10 Name Mike
10 Account Saving
10 Type Current
11 Party ISG
11 loan 11233
如果我给activityid 10,我应该得到如下结果
Activityid Activity Time Name Account Type
10 Activity1 Time1 Mike Saving Current
【问题讨论】:
嗨,欢迎来到 Stack Overflow。请您编辑您的问题并将数据包含为文本而不是图像吗?网络编辑器具有用于格式化该数据的选项。这使我们可以复制和粘贴数据来回答或使用该数据进行测试,而不是每个人都必须转录该数据。有关原因的更多信息,请参见此处:meta.***.com/questions/285551/…Key and values will change dynamically.
这是一个 SQL 反模式。 SQL 的设计和实现使得数据集具有固定数据类型的固定列。虽然您所要求的可以通过所谓的“动态 SQL”(读取数据并编写新代码以适应动态列的代码) 来完成,但通常是不正确的方法。这就提出了问题;你为什么要这样做?如果是为了向人类展示数据,请在 SQL 之外进行转换。如果是为了进一步的 SQL 处理,请保持当前(规范化)格式
【参考方案1】:
这种算法称为“透视”。 您可以使用 Db2 中链接 dynamic pivot SQL Query in DB2 中描述的通用例程。 使用以下调用为您的案例获取所需的结果集:
CALL PIVOT
(
'
SELECT A.*, B.key, B.value
FROM Activity A
JOIN Activities B ON B.Activityid = A.Activityid
WHERE A.Activityid = 10
'
, 'Activityid, Activity, Time'
, 'key'
, 'value'
, 'max'
, 'SESSION.PIVOT'
, '-'
, ?, ?, ?
);
【讨论】:
以上是关于用于将子行组合成单行视图的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
我想将 t-sql 中的 json 行组合成单个 json 行