2016-08-20 4 views
0

Мой запрос для задания выполняется в SSISDynamic Pivot в SQL для многократного столбца

SELECT 
    CONVERT(varchar(12), GETDATE(), 110) AS Date 
, j.name AS job_name 
, CONVERT(varchar(10), ja.run_requested_date, 108) AS Start_Time 
, CONVERT(varchar(10), CONVERT(datetime, RTRIM(19000101)) 
     + (jh.run_duration * 9 + jh.run_duration % 10000 * 6 
     + jh.run_duration % 100 * 10)/216e4, 108) AS run_duration 
, (ja.run_requested_date + (CONVERT(varchar(10), CONVERT(datetime, RTRIM(19000101)) 
    + (jh.run_duration * 9 
    + jh.run_duration 
    % 10000 * 6 
    + jh.run_duration % 100 
    * 10)/216e4, 108))) AS Completion_Time 
FROM 
    (msdb.dbo.sysjobactivity ja 
     LEFT JOIN msdb.dbo.sysjobhistory jh 
     ON ja.job_history_id = jh.instance_id 
    ) 
    JOIN msdb.dbo.sysjobs_view j 
    ON ja.job_id = j.job_id 
WHERE 
    ja.session_id = (
         SELECT 
          MAX(session_id) 
         FROM 
          msdb.dbo.sysjobactivity 
        ) 
    AND j.name IN ('a', 'b', 'c', 'd', 'e'); 

Я хочу, чтобы этот запрос, чтобы получить повернута в прилагаемом изображении. Также колонка даты должна быть от начала месяца до даты.

enter image description here

+0

Возможный дубликат (http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query) – Matt

+0

есть много примеров по динамическому pivot на этом веб-сайте, я просто пометил один из них для вас. Но для этого в SSIS вы должны спросить, что вы хотите делать со столом? если вы используете этот метод, поток данных действительно не может быть и речи, потому что SSIS не очень хорошо обрабатывает динамические столбцы. Но вы все равно можете использовать задачу сценария или компонент скрипта .... – Matt

ответ

0

Это может помочь

CREATE VIEW vwJobs 
AS 
    SELECT CONVERT(VARCHAR(12), GETDATE(), 110) AS Date , 
      j.name AS job_name , 
      CONVERT(VARCHAR(10), ja.run_requested_date, 108) AS Start_Time , 
      CONVERT(VARCHAR(10), CONVERT(DATETIME, RTRIM(19000101)) 
      + (jh.run_duration * 9 + jh.run_duration % 10000 * 6 
       + jh.run_duration % 100 * 10)/216e4, 108) AS run_duration , 
      (ja.run_requested_date 
       + (CONVERT(VARCHAR(10), CONVERT(DATETIME, RTRIM(19000101)) 
        + (jh.run_duration * 9 + jh.run_duration % 10000 * 6 
         + jh.run_duration % 100 * 10)/216e4, 108))) AS Completion_Time 
    FROM (msdb.dbo.sysjobactivity ja 
       LEFT JOIN msdb.dbo.sysjobhistory jh ON ja.job_history_id = jh.instance_id 
      ) 
      JOIN msdb.dbo.sysjobs_view j ON ja.job_id = j.job_id 
    WHERE ja.session_id = (SELECT MAX(session_id) 
           FROM  msdb.dbo.sysjobactivity 
          ) 
      AND j.name IN ('a', 'b', 'c', 'd', 'e'); 

GO 

--QUERY 
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX); 
DECLARE @ColumnNamesInPivot AS NVARCHAR(MAX); 

--Get distinct values of PIVOT Column 
SELECT TOP 100 PERCENT 
     @ColumnNamesInPivot = ISNULL(@ColumnNamesInPivot + ',', '') 
     + QUOTENAME([Date]) 
FROM (SELECT DISTINCT 
        [Date] 
      FROM  vwJobs 
     ) AS P 
ORDER BY [Date]; 

--Prepare the PIVOT query using the dynamic query 
SELECT @DynamicPivotQuery = N'Select job_name, ''Start_Time'' Time,' 
     + @ColumnNamesInPivot + ' 
      FROM (SELECT * 
      FROM  vwJobs 
     ) AS SourceTable PIVOT(MAX(Start_Time) FOR [Date] IN (' 
     + @ColumnNamesInPivot + ')) AS PVTTable 
    UNION ALL 
    Select job_name, ''Duration'' Time,' + @ColumnNamesInPivot + ' 
      FROM (SELECT * 
      FROM  vwJobs 
     ) AS SourceTable PIVOT(MAX(run_duration) FOR [Date] IN (' 
     + @ColumnNamesInPivot + ')) AS PVTTable 
    UNION ALL 
    Select job_name, ''End_Time'' Time,' + @ColumnNamesInPivot + ' 
      FROM (SELECT * 
      FROM  vwJobs 
     ) AS SourceTable PIVOT(MAX(Completion_Time) FOR [Date] IN (' 
     + @ColumnNamesInPivot + ')) AS PVTTable  
     Order by job_name 
     '; 

--SELECT @DynamicPivotQuery; 
EXEC sp_executesql @DynamicPivotQuery; 
+0

jarred-Невозможно увидеть результат при печати @DynamicPivotQuery. – rahul

+0

@ jarred-Мне нужно сохранить поворотный результат в объект, который я буду показывать в теле электронной почты, используя скрипт task.please для этого же. – rahul

+0

вы можете использовать Select @DynamicPivotQuery, чтобы увидеть результат запроса – Yared

0

Это, вероятно, будет намного более простым, если у вас есть один столбец месяц (включая год), а затем 31 столбцы для дней. Вам не нужно ничего динамичного. Если бы у вас были имена динамических столбцов, что бы вы сделали с SSIS?

0

UPDATE: - GetDate() выбран в качестве столбца даты в представлении. - Обновлен запрос PIVOT, чтобы не возвращать несколько строк.

Итак, вот запрос на обновление:

CREATE VIEW vwJobs 
AS 
    SELECT CONVERT(VARCHAR(12), run_requested_date, 110) AS Date , 
      j.name AS job_name , 
      CONVERT(VARCHAR(10), ja.run_requested_date, 108) AS Start_Time , 

      CONVERT(VARCHAR(10), CONVERT(DATETIME, RTRIM(19000101)) 
      + (jh.run_duration * 9 + jh.run_duration % 10000 * 6 
       + jh.run_duration % 100 * 10)/216e4, 108) AS run_duration , 

      (ja.run_requested_date 
       + (CONVERT(VARCHAR(10), CONVERT(DATETIME, RTRIM(19000101)) 
        + (jh.run_duration * 9 + jh.run_duration % 10000 * 6 
         + jh.run_duration % 100 * 10)/216e4, 108))) AS Completion_Time 
    FROM (msdb.dbo.sysjobactivity ja 
       LEFT JOIN msdb.dbo.sysjobhistory jh ON ja.job_history_id = jh.instance_id 
      ) 
      JOIN msdb.dbo.sysjobs_view j ON ja.job_id = j.job_id 
      JOIN (SELECT CONVERT(DATE, run_requested_date) date , 
         MAX(session_id) session_id 
       FROM  msdb.dbo.sysjobactivity 
       WHERE run_requested_date IS NOT NULL 
       GROUP BY CONVERT(DATE, run_requested_date) 
      ) ss ON ja.session_id = ss.session_id 

      AND j.name IN ('a', 'b', 'c', 'd', 'e'); 

GO 


--QUERY 
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX); 
DECLARE @ColumnNamesInPivot AS NVARCHAR(MAX); 

--Get distinct values of PIVOT Column 
SELECT TOP 100 PERCENT 
     @ColumnNamesInPivot = ISNULL(@ColumnNamesInPivot + ',', '') 
     + QUOTENAME([Date]) 
FROM (SELECT DISTINCT 
        [Date] 
      FROM  vwJobs 
     ) AS P 
ORDER BY [Date]; 

--Prepare the PIVOT query using the dynamic query 
SELECT @DynamicPivotQuery = N'Select job_name, ''Start_Time'' Time,' 
     + @ColumnNamesInPivot + ' 
      FROM (SELECT Date, job_name, Start_Time 
      FROM  vwJobs 
     ) AS SourceTable PIVOT(MAX(Start_Time) FOR [Date] IN (' 
     + @ColumnNamesInPivot + ')) AS PVTTable 
    UNION ALL 
    Select job_name, ''Duration'' Time,' + @ColumnNamesInPivot + ' 
      FROM (SELECT Date, job_name, run_duration 
      FROM  vwJobs 
     ) AS SourceTable PIVOT(MAX(run_duration) FOR [Date] IN (' 
     + @ColumnNamesInPivot + ')) AS PVTTable 
    UNION ALL 
    Select job_name, ''End_Time'' Time,' + @ColumnNamesInPivot + ' 
      FROM (SELECT Date, job_name, Completion_Time 
      FROM  vwJobs 
     ) AS SourceTable PIVOT(MAX(Completion_Time) FOR [Date] IN (' 
     + @ColumnNamesInPivot + ')) AS PVTTable  
     Order by job_name 
     '; 

--PRINT @DynamicPivotQuery; 
EXEC sp_executesql @DynamicPivotQuery; 

Результат в моей локальной: [? Динамический запрос SQL Server PIVOT] enter image description here