SQL Server - 数据透视表查询

时间:2011-11-11 14:05:04

标签: sql sql-server

我在作业历史记录表中显示以下内容

  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)

任何人都可以帮忙。

此致

1 个答案:

答案 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