用于将子行组合成单行视图的 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 查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL Server 将子查询结果重用于其他计算

mysql查询数据

我想将 t-sql 中的 json 行组合成单个 json 行

sql的嵌套查询,把一次查询的结果做为表继续进一步查询;内联视图

Oracle_SQL 单行函数

Oracle:如何通过将子查询删除到条件或加入同一张表来提高查询?