Saturday, 20 April 2019

Dynamic PIVOT Query In SQL server

ALTER PROCEDURE [dbo].[SP_DYNAMIC_PIVOT]
  
    @SELECT_QUERY_COLUMNS VARCHAR(255)='col as col,col',
    @PIVOT_COLUMN VARCHAR(255)='col',
    @VALUE_COLUMN VARCHAR(255)='col',
    @TABLEORSQLWITHDBO VARCHAR(MAX)='dbo.TABLENAME',
    @ORDER_BY_COLUMNS VARCHAR(255) = 'col',
    @Aggregate VARCHAR(20) = 'COUNT',
    @OUTPUT_RESULT_SQL VARCHAR(10) = '',--SQL
    @OUTPUT_RESULT_INTO_TABLENAME VARCHAR(100) = 'RESULT',
    @SQLOutput VARCHAR(MAX) = NULL OUT
AS
BEGIN
  
    DECLARE @PivotValuesCSV NVARCHAR(MAX),
            @PivotSQL NVARCHAR(MAX),
            @DistinctPivotValuesSQL NVARCHAR(MAX),
            @OutputResultsIntoTableSQL NVARCHAR(100);
    --
    SET @DistinctPivotValuesSQL =  'SELECT TOP 1 STUFF((SELECT DISTINCT '', '' + CAST(''[''+CONVERT(VARCHAR,'+ @PIVOT_COLUMN+')+'']''  AS VARCHAR(50)) [text()]
                                FROM '+@TABLEORSQLWITHDBO+' AS a
                                WHERE ISNULL('+@PIVOT_COLUMN+','''') !=  ''''
                                FOR XML PATH(''''), TYPE)
                                    .value(''.'',''NVARCHAR(MAX)''),1,2,'' '') AS PIVOT_VALUES
                                FROM '+@TABLEORSQLWITHDBO+' AS ma
                                ORDER BY ' + @PIVOT_COLUMN + '';
    
    SELECT @OutputResultsIntoTableSQL = CASE WHEN @OUTPUT_RESULT_INTO_TABLENAME IS NULL THEN '' ELSE (' INTO ' + @OUTPUT_RESULT_INTO_TABLENAME + ' ') END;
    CREATE TABLE #Temp(PivotColumnsCSV NVARCHAR(MAX));
    INSERT INTO #Temp EXEC SP_EXECUTESQL  @DistinctPivotValuesSQL;
    SELECT @PivotValuesCSV = PivotColumnsCSV  FROM #Temp;
    DROP TABLE #Temp;    
  
    SET @PivotSQL = 'SELECT * ' + CHAR(13) +
                    @OutputResultsIntoTableSQL + CHAR(13) +
                    'FROM  ( ' + CHAR(13) +
                    '  SELECT ' + @SELECT_QUERY_COLUMNS + ' , ' + @PIVOT_COLUMN + ', ' + @VALUE_COLUMN + ' FROM '+@TABLEORSQLWITHDBO+' AS innr ' + CHAR(13) +
                    '       ) a ' + CHAR(13) +
                    'PIVOT ' + CHAR(13) +
                    '( ' + CHAR(13) +
                    '   '+@Aggregate+'('+@VALUE_COLUMN+') ' + CHAR(13) +
                    '   FOR ' + @PIVOT_COLUMN + ' IN (' + @PivotValuesCSV + ') ' + CHAR(13) +
                    ') piv ' + CHAR(13) +
                    'ORDER BY ' + @ORDER_BY_COLUMNS;
SET @PivotSQL += ' SELECT * FROM ' + @OUTPUT_RESULT_INTO_TABLENAME
SET @PivotSQL += ' DROP TABLE ' + @OUTPUT_RESULT_INTO_TABLENAME
    PRINT @PivotSQL;
    --Return either the SQL or the actual results!
    IF (@OUTPUT_RESULT_SQL = 'SQL')
        --SELECT @PivotSQL AS PivotSQL;
        SELECT @SQLOutput = @PivotSQL;
    ELSE
        EXEC SP_EXECUTESQL @PivotSQL;
END;

No comments:

Post a Comment