2011-11-11 4 views
0

I afficher les éléments suivants de la table d'historique des travauxSQL Server - Tableau croisé dynamique de requête

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 

Je veux afficher dans PIVOT FORMAT

Pour le mois - par jour pour un travail spécifique - voir la temps d'exécution pour les différentes étapes (que je suis en train de prendre mais pas en PIVOT FORMAT)

Quelqu'un peut-il aider s'il vous plaît.

Cordialement

+0

Avez-vous une liste fixe de "Steps"? Je suis sûr qu'il existe des générateurs pour construire la requête sinon, mais si vous avez un ensemble spécifique de "Steps" basé sur leurs ID correspondants, je pourrais aider avec la requête SPECIFIC au lieu de générique – DRapp

+0

Les étapes sont fixes - 10 étapes exécutées dans ce travail tous les jours. –

Répondre

0

Fondamentalement, déplacez votre requête dans une requête que j'Aliased FROM (sous-select) le résultat comme "PreQuery". À partir de là, pour chaque étape que vous souhaitez voir apparaître en tant que colonne, vous devez envelopper un SUM (cas/when). Le "As" vous devez faire/nom pour représenter ce que cette étape est le nom de la colonne finale. Je n'ai évidemment pas/connais les étapes et ne peux donc pas forcer le nom de la colonne finale, mais je pense que cela vous donne assez de travail.

Comme pour la raison de SUM() et GROUP BY de la requête externe. Pour chaque date, la requête interne retournera UP TO mais il y a beaucoup de pas de données. Puisque vous ne voulez qu'une seule ligne pour la finale par date, nous devons créer le tableau croisé, donc regrouper par juste la date. C'est correct car il n'y aura qu'un seul enregistrement par "étape", la somme d'une seule instance ne donnera qu'une seule fois cette valeur. Si aucune "étape" est trouvée, la valeur sera NULL (ou 0 si vous appliquez un COALESCE() sur elle.

Hope this sens.

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 

groupe par PreQuery.Run_date

Questions connexes