不能从子查询将行转换为列
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 等等。相应字段中的数据将包含聚合值。 戈登,你是个真正的绅士。非常感谢,我应该想到这种方法。以上是关于不能从子查询将行转换为列的主要内容,如果未能解决你的问题,请参考以下文章