使用SQL Server中遇到的数据查询数据

时间:2017-09-26 02:58:20

标签: sql-server

我有一个包含3个nvarchar列,1个时间列和2个列Pass和Fail的表。我需要按时间列显示数据。在每个里程碑上,将有通过和失败的数量。我使用Pivot和它唯一的输出Pass结果没有失败。我尝试了一切。请帮忙

这是输入数据:

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

我可以不使用pivot来失败吗?

我需要输出结果:

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

请帮忙。谢谢!

1 个答案:

答案 0 :(得分: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,'+@cols2+' From
                (
                 SELECT Col1,Col2,Col3,Time,Pass,Fail
                  FROM #Temp
                ) AS X
             PIVOT 
                (
                SUM(Pass)
                FOR [Time] IN ('+@cols+' )
                ) p1
                    Group by Col1,Col2,Col3
                ),Cte2
                AS
                    (
                    SELECT '+@cols3+' From
                    (
                      SELECT Col1,Col2,Col3,Time,Pass,Fail
                        from #Temp
                    ) x
                    PIVOT 
                    (
                        SUM(Fail)
                        FOR Time IN ('+@cols+')
                    )p1
                    Group by Col1,Col2,Col3
                    )
                    SELECT  Col1,Col2,Col3,'+@Dyncols+' 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