使用 TSQL 对简单聚合总计进行 UNPIVOT...这甚至可能吗?
Using TSQL to UNPIVOT simple aggregated totals...is this even possible?
我试图在将某些数据加载到 Microsoft PowerBI 之前对其执行简单的反旋转。由于 PowerBI 报告必须使用 DirectQuery,因此不能在查询编辑器中使用 'Unpivot'。因此,这似乎可以在加载的初始 SQL 中完成。
select
sum(case when cw.State = 'WORK' then 1 else null end) [Work]
,sum(case when cw.State = 'OUT' then 1 else null end) [Out]
,sum(case when cw.State = 'POST' then 1 else null end) [Post]
from CurrentWork cw
此代码输出:
Work Out Post
---- --- ----
5 3 21
但我希望输出显示如下:
Event Amount
----- ------
Work 5
Out 3
Post 21
我想我需要使用 UNPIVOT TSQL 命令,但想不出正确的使用方法。
这有可能吗,还是我从错误的方向来解决这个问题?
你不需要做 UNPIVOT
,你想要聚合:
select status, count(*)
from CurrentWork
group by status;
如果汇总了以上数据,则可以将 subuqery
或 cte
与 apply
一起使用:
with t as (
select sum(case when cw.State = 'WORK' then 1 else null end) [Work]
sum(case when cw.State = 'OUT' then 1 else null end) [Out]
sum(case when cw.State = 'POST' then 1 else null end) [Post]
from CurrentWork cw
)
select tt.Event, tt.[Amount]
from t cross apply
( values ([Work], [Amount]), ([Out], [Amount]), ([Post], [Amount])
) tt(Event, [Amount]);
我试图在将某些数据加载到 Microsoft PowerBI 之前对其执行简单的反旋转。由于 PowerBI 报告必须使用 DirectQuery,因此不能在查询编辑器中使用 'Unpivot'。因此,这似乎可以在加载的初始 SQL 中完成。
select
sum(case when cw.State = 'WORK' then 1 else null end) [Work]
,sum(case when cw.State = 'OUT' then 1 else null end) [Out]
,sum(case when cw.State = 'POST' then 1 else null end) [Post]
from CurrentWork cw
此代码输出:
Work Out Post
---- --- ----
5 3 21
但我希望输出显示如下:
Event Amount
----- ------
Work 5
Out 3
Post 21
我想我需要使用 UNPIVOT TSQL 命令,但想不出正确的使用方法。
这有可能吗,还是我从错误的方向来解决这个问题?
你不需要做 UNPIVOT
,你想要聚合:
select status, count(*)
from CurrentWork
group by status;
如果汇总了以上数据,则可以将 subuqery
或 cte
与 apply
一起使用:
with t as (
select sum(case when cw.State = 'WORK' then 1 else null end) [Work]
sum(case when cw.State = 'OUT' then 1 else null end) [Out]
sum(case when cw.State = 'POST' then 1 else null end) [Post]
from CurrentWork cw
)
select tt.Event, tt.[Amount]
from t cross apply
( values ([Work], [Amount]), ([Out], [Amount]), ([Post], [Amount])
) tt(Event, [Amount]);