Сводная таблица SQL с динамическим столбцом

#sql #sql-server #tsql #pivot

#sql #sql-сервер #tsql #сводная

Вопрос:

Я пытаюсь создать сводную таблицу в SQL с динамическими заголовками. У меня заголовки работают просто отлично, но я не могу понять, как группировать строки.

Примером данных является

 CriteriaID     KSB_Requirement        ModuleID    Module_Title
   1         Understand something       5         Principles 1
   1         Understand something       6         Principles 2 
   1         Understand something       7         Principles 3 
   2         Learn something            5         Principles 1
   2         Learn something            6         Principles 2
  

Результат, который я получаю, используя:

 DECLARE 
  @cols AS NVARCHAR(MAX),
  @query  AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ','   QUOTENAME(Module_Title) 
            FROM Standards_Coverage_Pivot_Data
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT KSB_Requirement, '   @cols   ' from 
            Standards_Coverage_Pivot_Data 
            pivot 
            (
                Count(CriteriaID)
                for Module_Title in ('   @cols   ')
            ) p '
 execute(@query);
  

есть….

 KSB_Requirement       Principle 1    Principle 2    Principle 3
Understand something      1              0              0
Understand something      0              1              0
Understand something      0              0              1
Learn something           1              0              0
Learn something           0              1              0
  

Что я действительно хочу отобразить, так это:

 KSB_Requirement       Principle 1    Principle 2    Principle 3
Understand something      1              1              1
Learn something           1              1              0
  

Любая помощь была бы высоко оценена.

Ответ №1:

Вы были почти на месте

 DECLARE 
  @cols AS NVARCHAR(MAX),
  @query  AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ','   QUOTENAME(Module_Title) 
            FROM Standards_Coverage_Pivot_Data
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT * from (Select KSB_Requirement,Module_Title,CriteriaID From Standards_Coverage_Pivot_Data) s
            pivot 
            (
                Count(CriteriaID)
                for Module_Title in ('   @cols   ')
            ) p '
 execute(@query);
  

ВОЗВРАТ

 KSB_Requirement       Principles 1  Principles 2    Principles 3
Learn something       1             1               0
Understand something  1             1               1
  

Комментарии:

1. @gillers322 Рад помочь.. Но давайте будем честными, вы выполнили основную часть работы, и у вас был хорошо структурированный вопрос… таким образом, преимущество