2011-11-11 15 views
0

私は月のPIVOT形式で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 

ジョブ履歴テーブルから次を表示 - 日によって特定の仕事のために - 参照さまざまなステップの実行時間(ピボット・フォーマットではなくなっているIm)

誰でも助けてください。

よろしく基本的に

+0

"ステップ"の固定リストがありますか?そうでない場合は、クエリをビルドするジェネレータはありますが、対応するIDに基づいて特定の "ステップ"がある場合は、 – DRapp

+0

ステップは固定されています。毎日そのジョブで10ステップが実行されます。 –

答えて

0

、私は「PreQuery」として結果をエイリアスFROM(サブ選択)クエリにクエリを移動します。これから、各ステップについて、列として表示する場合は、SUM(case/when)にラップされます。 "As"は、そのステップが最終的なカラム名であることを表す/ nameにする必要があります。私は明らかにステップを持っていない/知っていないので、最後のカラム名を強制することはできませんが、これで十分であると思います。

外部クエリのSUM()およびGROUP BYの理由は同じです。日付ごとに、内側のクエリはUPに戻りますが、多くのステップにはデータがあります。最終的な日付ごとに1行しか必要ないので、クロスタブを作成して日付だけでグループ化する必要があります。 「ステップ」ごとに1つのレコードしか存在しないので、これはOKです。単一のインスタンスの合計は、その値を1回だけ与えます。そのような「ステップ」が見つからない場合、あなたはそれを()COALESCEを適用した場合、値は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_date