Advertisement
Guest User

Untitled

a guest
Dec 11th, 2020
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.02 KB | None | 0 0
  1. -- Создаем универсальную процедуру для динамического PIVOT
  2. CREATE OR ALTER PROCEDURE SP_Dynamic_Pivot
  3. (
  4. @TableSRC NVARCHAR(100), --Таблица источник (Представление)
  5. @ColumnName NVARCHAR(100), --Столбец, содержащий значения, которые станут именами столбцов
  6. @Field NVARCHAR(100), --Столбец, над которым проводить агрегацию
  7. @FieldRows NVARCHAR(100), --Столбец (столбцы) для группировки по строкам (Column1, Column2)
  8. @FunctionType NVARCHAR(20) = 'SUM',--Агрегатная функция (SUM, COUNT, MAX, MIN, AVG), по умолчанию SUM
  9. @Condition NVARCHAR(200) = '' --Условие (WHERE и т.д.). По умолчанию без условия
  10. )
  11. AS
  12. BEGIN
  13. /*
  14. Универсальная процедура формирования динамического запроса PIVOT.
  15. Разработчик Info-Comp.ru
  16. */
  17.  
  18. --Отключаем вывод количества строк
  19. SET NOCOUNT ON;
  20.  
  21. --Переменная для хранения строки запроса
  22. DECLARE @Query NVARCHAR(MAX);
  23. --Переменная для хранения имен столбцов
  24. DECLARE @ColumnNames NVARCHAR(MAX);
  25. --Переменная для хранения заголовков результирующего набора данных
  26. DECLARE @ColumnNamesHeader NVARCHAR(MAX);
  27.  
  28. --Обработчик ошибок
  29. BEGIN TRY
  30. --Таблица для хранения уникальных значений,
  31. --которые будут использоваться в качестве столбцов
  32. CREATE TABLE #ColumnNames(ColumnName NVARCHAR(100) NOT NULL PRIMARY KEY);
  33.  
  34. --Формируем строку запроса для получения уникальных значений для имен столбцов
  35. SET @Query = N'INSERT INTO #ColumnNames (ColumnName)
  36. SELECT DISTINCT COALESCE(' + @ColumnName + ', ''Пусто'')
  37. FROM ' + @TableSRC + ' ' + @Condition + ';'
  38.  
  39. --Выполняем строку запроса
  40. EXEC (@Query);
  41.  
  42. --Формируем строку с именами столбцов
  43. SELECT @ColumnNames = ISNULL(@ColumnNames + ', ','') + QUOTENAME(ColumnName)
  44. FROM #ColumnNames;
  45.  
  46. --Формируем строку для заголовка динамического перекрестного запроса (PIVOT)
  47. SELECT @ColumnNamesHeader = ISNULL(@ColumnNamesHeader + ', ','')
  48. + 'COALESCE('
  49. + QUOTENAME(ColumnName)
  50. -->>>>>>>>>>
  51. + ', NULL) AS '
  52. --<<<<<<<<<<<<<
  53. --+ ', 0) AS '
  54. + QUOTENAME(ColumnName)
  55. FROM #ColumnNames;
  56.  
  57. --Формируем строку с запросом PIVOT
  58. SET @Query = N'SELECT ' + @FieldRows + ' , ' + @ColumnNamesHeader + '
  59. FROM (SELECT ' + @FieldRows + ', ' + /*>>>>>>@ColumnName + ', ' +<<<<<<<*/ @Field
  60. + ' FROM ' + @TableSRC + ' ' + @Condition + ') AS SRC
  61. PIVOT ( ' + @FunctionType + '(' + @Field + ')' +' FOR ' +
  62. @ColumnName + ' IN (' + @ColumnNames + ')) AS PVT
  63. ORDER BY ' + @FieldRows + ';'
  64.  
  65. --Удаляем временную таблицу
  66. DROP TABLE #ColumnNames;
  67.  
  68. --Выполняем строку запроса с PIVOT
  69. PRINT (@Query);
  70. EXEC (@Query);
  71.  
  72. --Включаем обратно вывод количества строк
  73. SET NOCOUNT OFF;
  74.  
  75. END TRY
  76. BEGIN CATCH
  77. --В случае ошибки, возвращаем номер и описание этой ошибки
  78. SELECT ERROR_NUMBER() AS [Номер ошибки],
  79. ERROR_MESSAGE() AS [Описание ошибки]
  80. END CATCH
  81. END
  82.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement