SQL Query with Dynamic Columns Using Pivot

后端 未结 3 2089
遥遥无期
遥遥无期 2021-01-25 08:40

I know this topic is everywhere but I couldn\'t get it to work properly. It\'s probably something very simple.

Here is a sample of the data after a basic query:

3条回答
  •  醉酒成梦
    2021-01-25 09:19

    Using Dynamic Sql

    IF OBJECT_ID('tempdb..#TempData', 'U') IS NOT NULL 
    DROP TABLE #TempData;
    
    CREATE TABLE #TempData (
        [Site] CHAR(3) NOT NULL,
        Model VARCHAR(30) NOT NULL,
        SomeCount INT NOT NULL DEFAULT(0)
        );
    INSERT #TempData (Site, Model, SomeCount) VALUES
        ('AAA', 'ProLiant DL380 G7', 1), 
        ('AAA', 'OptiPlex 790', 500), 
        ('BBB', 'OptiPlex 780', 80),
        ('CCC', 'OptiPlex 790', 23);
    
    Declare @DynamicCol nvarchar(max),@DynamicColNull nvarchar(max)
            ,@Sql nvarchar(max)
    
    SELECT @DynamicColNull=STUFF((SELECT DISTINCT ', '+'ISNULL('+QUOTENAME(Model),','+'''0'''+') As '+QUOTENAME(Model)
                            FROM #TempData FOR XML PATH ('')),1,2,'')
    
    SELECT @DynamicCol=STUFF((SELECT DISTINCT ', '+QUOTENAME(Model) FROM #TempData FOR XML PATH ('')),1,2,'')
    
    SET @Sql='SELECT [Site], '+@DynamicColNull+' From
                (   
                SELECT * from #TempData
                )
                AS Src
                PIVOT
                (
                MAX(SomeCount) FOR [Model] IN ('+@DynamicCol+')
                )AS Pvt'
    PRINT @Sql
    EXEC(@Sql)
    

    Result

    Site    OptiPlex 780    OptiPlex 790    ProLiant DL380 G7
    AAA         0               500             1
    BBB         80              0               0
    CCC         0               23              0
    

提交回复
热议问题