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