【发布时间】:2020-10-16 01:32:31
【问题描述】:
我在获取从变量到 CTE 到 Pivot 的语法正确时遇到问题。我正在将 sp_whoisactive 捕获到一个表中,现在正在按区域聚合 CPU 和持续时间。然后,我想对这些结果进行透视,以便在 Excel 中轻松绘制图表。我的解决方法是输出到 #Temp 表,这会在尝试输出到 Excel 工作表时导致 SSIS 出现问题。
为简洁起见,我缩减了 CASE 语句。大约有 30 个地区。
如何将其包装在 CTE 中,以便可以使用开始和结束变量日期进行透视并消除 #Temp 表?
IF OBJECT_ID('tempdb..#MySP') IS NOT NULL
DROP TABLE #MySP
DECLARE @StartDate DATETIME, @EndDate DATETIME
SET @StartDate = DATEADD(hh,23,DATEADD(dd,DATEDIFF(dd,0,GETDATE()-1),0))
SET @EndDate = DATEADD(hh,9,DATEADD(dd,DATEDIFF(dd,0,GETDATE()-0),0))
;WITH CTE AS
(
select --login_name, login_time, session_id,
(Substring([dd hh:mm:ss.mss],1,2) * 86400) + (Substring([dd hh:mm:ss.mss],4,2) * 3600) + (Substring([dd hh:mm:ss.mss],7,2) * 60) + (Substring([dd hh:mm:ss.mss],10,2)) as TotalSec
,t.*
from (
select w.*,
row_number() over(partition by session_id, login_time, login_name order by collection_time desc) rn
from Regional.DBA.WhoIsActive w
) t
where rn = 1 and login_time between @StartDate and @EndDate
), RESULT as
(
select CTE.login_name , SUM(CTE.TotalSec ) as UserSecTot, SUM(CONVERT(int,REPLACE(cte.CPU,',',''))) as UserCPUTot from CTE
Group by CTE.login_name
)
select @StartDate as StartDate, @EndDate as EndDate,
CASE
WHEN login_name = 'sa' then 'sa'
WHEN ParseName(Replace(login_name,'\','.'),2) like '%vhamaster%' and login_name like '%Region01%' or login_name like '%_V1%' THEN 'Region01'
WHEN ParseName(Replace(login_name,'\','.'),2) like '%vhamaster%' and login_name like '%Region02%' or login_name like '%_V2%' THEN 'Region02'
WHEN ParseName(Replace(login_name,'\','.'),2) like '%vhamaster%' then 'z' + ParseName(Replace(login_name,'\','.'),1)
WHEN ParseName(Replace(login_name,'\','.'),2) like '%Reg01%' then 'Region01'
WHEN ParseName(Replace(login_name,'\','.'),2) like '%Reg02%' then 'Region02'
ELSE ParseName(Replace(login_name,'\','.'),2)
END as Domain , login_name, DBA.udf_SecToHHMMSS(UserSecTot) as Total_Time, UserSecTot, UserCPUTot
into #MySP
from RESULT
select * from #MySP
select * from
(select Domain, UserCPUTot from #MySP) as sourcetable
PIVOT(
sum(UserCPUTot)
FOR Domain IN (
[Region01],
[Region02]
)
) AS pivot_table;
select * from
(select Domain, UserSecTot from #MySP) as sourcetable
PIVOT(
sum(UserSecTot)
FOR Domain IN (
[Region01],
[Region02]
)
) AS pivot_table;
【问题讨论】:
标签: sql sql-server pivot