我在作业历史记录表中显示以下内容
SELECT
sum(run_duration) as [RUN_DURATION],
sysjobhistory.step_id,
sysjobhistory.step_name
FROM msdb.dbo.sysjobhistory
INNER JOIN msdb.dbo.sysjobs
ON msdb.dbo.sysjobhistory.job_id = msdb.dbo.sysjobs.job_id
WHERE sysjobhistory.run_date <= Datepart(yyyy, @dateparam) * 10000 +
Datepart(mm, @dateparam) * 100 +
Datepart
(
dd, @dateparam)
AND sysjobs.name = @JobName --remove this line if you want to show all jobs for the specified day
AND step_id <> 0
-- AND run_status = 1
GROUP BY RUN_DATE, sysjobhistory.step_id,sysjobhistory.step_name
我想以PIVOT FORMAT
显示对于特定工作的月 - 按日 - 查看各个步骤的执行时间(我得到的但不是PIVOT FORMAT)
任何人都可以帮忙。
此致
答案 0 :(得分:0)
基本上,将查询移动到FROM(子选择)查询中,我将结果别名为“PreQuery”。从这一点来看,对于每个要显示为列的步骤都包含在SUM中(case / when)。您应该使用“As”来表示/表示该步骤作为最终列名称。我显然没有/知道步骤,因此不能强制使用最终的列名,但我认为这足以让你使用。
关于外部查询的SUM()和GROUP BY的原因。对于每个日期,内部查询将返回UP TO,但是有许多数据步骤。由于每个日期最终只需要一行,我们必须创建交叉表,因此只按日期分组。这是可以的,因为每个“步骤”只有一个记录,单个实例的总和只会给出一次该值。如果没有找到这样的“步骤”,则该值将为NULL(如果在其上应用COALESCE(),则为0。
希望这是有道理的。
select
PreQuery.Run_Date,
SUM( case when PreQuery.step_id = 1 then PreQuery.Run_Duration end )
as Step1DescriptiveNameForColumn,
SUM( case when PreQuery.step_id = 2 then PreQuery.Run_Duration end )
as Step2DescriptiveNameForColumn,
SUM( case when PreQuery.step_id = 3 then PreQuery.Run_Duration end )
as Step3DescriptiveNameForColumn,
SUM( case when PreQuery.step_id = 4 then PreQuery.Run_Duration end )
as Step4DescriptiveNameForColumn,
etc... for 5-10
from
( SELECT
sjh.Run_Date,
sjh.step_id,
sjh.step_name,
sum(sj.run_duration) as [RUN_DURATION]
FROM
msdb.dbo.sysjobhistory sjh
INNER JOIN msdb.dbo.sysjobs sj
ON sjh.job_id = sj.job_id
WHERE
sjh.step_id <> 0
AND sjh.run_date <= Datepart(yyyy, @dateparam) * 10000
+ Datepart(mm, @dateparam) * 100
+ Datepart(dd, @dateparam)
GROUP BY
RUN_DATE,
sjh.step_id,
sjh.step_name ) PreQuery
分组 PreQuery.Run_date