不能从子查询将行转换为列

Posted

技术标签:

【中文标题】不能从子查询将行转换为列【英文标题】:Cannot not Convert Rows to Columns From SubQuery 【发布时间】:2020-05-14 13:09:55 【问题描述】:

我目前在尝试将子查询中的行转换为列时遇到了实际问题。我需要创建一个简单的表来计算每个代理的多个属性(为简单起见,我目前只包含一个聚合字段),然后将行转换为列。

基本上,我想要的只是获取子查询的输出,并使 Agent_Name 中的值成为 Columns 和 Outcome_1 字段成为行,然后 Outcome_2 ..3 等等;但是,到目前为止,我的尝试只列出了代理名称,但没有列出 OUTCOME_1 或任何值。

使用 Oracle 数据库

当前代码尝试

Select *
from
(Select AGENT_NAME, OUTCOME_1 from
(select AGENT_NAME, 
SUM(CASE when CLOSING_REASON = 6 then 1 else 0 end) as OUTCOME_1
from all_cases
join
users
on all_cases.user_ID = USers.ID
where Group_ID = 14
and Start_time > to_DATE ('01/04/2020 00:00:00', 'DD-MM-YYYY HH24:MI:SS')
group by FULL_NAME)T1)
Pivot(MAX(OUTCOME_1) for AGENT_NAME in ('USER1','User2','User3','User4'))

【问题讨论】:

【参考方案1】:

只使用条件聚合:

select u.agent_name,
       sum(case when CLOSING_REASON = 6 then 1 else 0 end) as OUTCOME_1,
       . . . 
from all_cases ac join
     users
     on ac.user_ID = u.ID
where Start_time >= date '2020-04-01'
group by u.agent_name;

如果您希望代理旋转并在行上显示结果,想法是一样的,只是细节有所改变:

select closing_reason,
       sum(case when agent_name = 'a' then 1 else 0 end) as agent_a,
       sum(case when agent_name = 'b' then 1 else 0 end) as agent_b,
       . . . 
from all_cases ac join
     users
     on ac.user_ID = u.ID
where Start_time >= date '2020-04-01'
group by u.agent_name;

【讨论】:

感谢您抽出宝贵时间回复戈登。您的解决方案本质上是潜艇正在做的事情,但是;但是,当我实际需要转置时,表输出的第 1 列将是代理名称,因此第一列是结果字段的名称,然后第 2 列将是 User1..Column 2 将是 User_2 等等。相应字段中的数据将包含聚合值。 戈登,你是个真正的绅士。非常感谢,我应该想到这种方法。

以上是关于不能从子查询将行转换为列的主要内容,如果未能解决你的问题,请参考以下文章

将行转换为列的 MS SQL 连接查询

如何展平 SQL 查询的结果 - 将行转换为列?

带有过程调用的 Oracle 多列子查询

使用可能的组合将行转换为列

Laravel 查询生成器 从子查询中选择

使用可能的组合将行转换为列