2017-09-26 2 views
0

3,nvarchar 열, 1 시간 열 및 2 열 합계 및 실패 테이블이 있습니다. 시간 열에 따라 데이터를 표시해야합니다. 각 이정표에 합격과 실패의 숫자가 있습니다. 필자는 피벗 (Pivot)과 그 유일한 출력 패스 결과를 실패없이 사용합니다. 나는 모든 것을 시도했다.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 
를 예상대로 정확하게 필요한 것을이 생각
관련 문제