SQL Server-透视表查询

SQL Server-透视表查询,sql,sql-server,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.

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

  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格式的各个步骤的执行时间

谁能帮忙吗


关于

基本上,将查询移动到一个FROM子选择查询中,我将结果别名为PreQuery。由此,对于要显示为列的每个步骤,都将包装在SUM case/when中。As-you-should-make/name表示该步骤作为最终列名。我显然不知道这些步骤,因此无法强制使用最终的列名,但我认为这足以让您使用

至于外部查询的SUM和GROUP BY的原因。对于每个日期,内部查询将返回数据的多少个步骤。由于您只需要为每个日期的最后一行创建一个交叉表,因此只能按日期分组。这是可以的,因为每个步骤只有一条记录,单个实例的总和只给出该值一次。如果未找到此类步骤,则该值将为NULL,如果对其应用合并,则该值将为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\u date

您有固定的步骤列表吗?我肯定会有生成器生成查询,但如果您有一组基于相应ID的特定步骤,我可以帮助您进行特定查询,而不是一般查询。步骤是固定的-每天在该作业中执行10个步骤。