2017-09-26 1 views
0

私は3 nvarcharカラム、1タイムカラム、および2カラムの合格と失敗のテーブルを持っています。私は時間の列でデータを表示する必要があります。各マイルストーンで、合格と不合格の数があります。私はPivotとその唯一の出力Passの結果をFailを使用して使用します。私はすべてを試みた。SQL Serverで発生したピボットを使用したデータクエリ

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 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 

:これは、入力データである

助けてください?

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 
を期待どおりに必要なもの、これを考えます
関連する問題