2017-09-26 59 views
0

我有一個3 nvarchar列,1時間列和2列通過和失敗的表。我需要按時間欄顯示數據。在每個里程碑上,都會有通過和失敗的次數。我使用Pivot及其唯一的輸出傳遞結果沒有失敗。我嘗試了一切。請幫助在SQL Server中遇到數據查詢使用數據庫

這是輸入數據:

Col1 Col2 Col3 Time Pass Fail 
------------------------------------ 
A  B  C 08:30 80  0 
A  B  C 09:30 60  2 
A  B  C 10:30 80  0 
A  B  C 11:30 70  0 

我使用這個代碼:

DECLARE @cols AS NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX) 

SELECT 
    @cols = STUFF((SELECT ',' + QUOTENAME(Time) 
        FROM Your_Table 
        GROUP BY Time 
        ORDER BY Time 
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

SET @query = 'SELECT Col1,Col2,Col3,' + @cols + ' from 
      (
       SELECT Col1,Col2,Col3,Time,Pass,Fail 
       from TD_SanLuong_CN 
      ) x 
      pivot 
      (
       sum(Pass) 
       for Time in (' + @cols + ') 
      ) p1 
      pivot 
      (
       sum(Fail) 
       for Time in (' + @cols + ') 
      ) p2' 

execute(@query); 

我不能用樞軸失敗?

我需要的輸出結果:

Col1 Col2 Col3 08:30_Pass 08:30_Fail 09:30_Pass 09:30_Fail ... 
A  B  C  80   0   60   2 

請幫助。謝謝!

回答

0

嗨看看這段代碼,我覺得這是你期望的輸出

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL 
Drop table #Temp 

CREATE TABLE #Temp (
    Col1 CHAR(1), 
    Col2 CHAR(1), 
    Col3 CHAR(1), 
    [Time] TIME(0), 
    Pass INT, 
    Fail INT 
    ); 
INSERT #Temp (Col1, Col2, Col3, [Time], Pass, Fail) VALUES 
    ('A', 'B', 'C', '08:30', 80, 0), 
    ('A', 'B', 'C', '09:30', 60, 2), 
    ('A', 'B', 'C', '10:30', 80, 0), 
    ('A', 'B', 'C', '11:30', 70, 0); 



DECLARE @cols AS NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX), 
     @cols2 AS NVARCHAR(MAX), 
     @cols3 AS NVARCHAR(MAX), 
     @Dyncols AS NVARCHAR(MAX) 

SELECT 
    @cols = STUFF((SELECT ',' + QUOTENAME(Time) 
        FROM #Temp 
        GROUP BY [Time] 
        ORDER BY [Time] 
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

SELECT 
    @cols2 = STUFF((SELECT ',' + 'MAX('+QUOTENAME(Time)+')' +' As '+ '['+CAST((Time) AS VARCHAR)+'_Pass'+']' 
        FROM #Temp 
        GROUP BY [Time] 
        ORDER BY [Time] 
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 
SELECT 
    @cols3 = STUFF((SELECT ',' + 'MAX('+QUOTENAME(Time)+')' +' As '+ '['+CAST((Time) AS VARCHAR)+'_Fail'+']' 
        FROM #Temp 
        GROUP BY [Time] 
        ORDER BY [Time] 
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 
SELECT 
    @Dyncols = STUFF((SELECT ',' + '['+CAST((Time) AS VARCHAR)+'_Pass'+']'+','+'['+CAST((Time) AS VARCHAR)+'_Fail'+']' 
        FROM #Temp 
        GROUP BY [Time] 
        ORDER BY [Time] 
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

SET @query=';with cte 
       AS 
       (
       SELECT Col1,Col2,Col3,'[email protected]+' From 
       (
       SELECT Col1,Col2,Col3,Time,Pass,Fail 
        FROM #Temp 
       ) AS X 
      PIVOT 
       (
       SUM(Pass) 
       FOR [Time] IN ('[email protected]+') 
       ) p1 
        Group by Col1,Col2,Col3 
       ),Cte2 
       AS 
        (
        SELECT '[email protected]+' From 
        (
         SELECT Col1,Col2,Col3,Time,Pass,Fail 
         from #Temp 
        ) x 
        PIVOT 
        (
         SUM(Fail) 
         FOR Time IN ('[email protected]+') 
        )p1 
        Group by Col1,Col2,Col3 
        ) 
        SELECT Col1,Col2,Col3,'[email protected]+' FROM cte ,Cte2' 

PRINT @query 

EXEC(@query) 

結果

Col1 Col2 Col3 08:30:00_Pass 08:30:00_Fail 09:30:00_Pass 09:30:00_Fail 10:30:00_Pass 10:30:00_Fail 11:30:00_Pass 11:30:00_Fail 
A  B  C   80    0    60    2    80    0    70    0 
什麼你到底需要