2013-07-21 3 views
0

Doing SQL Pivot Динамические столбцы с функцией STUFF, но не получаю результат я хочуSQL Pivot Динамические функции Столбцы STUFF пустые ячейки

Вот SQL скрипку http://sqlfiddle.com/#!3/241c2/6/0

Что я могу сделать, чтобы избавиться от всех нуль \ пустые ячейки?

Я хотел бы, чтобы в результате чего дисплей будет что-то вроде этого, где каждый столбец показывает список классов, каждый студент присвоенных без кучи пустых ячеек

 
Tom  Harry  Mary  Sue  Paul 
Algebra  Algebra  Algebra  Algebra  Geometry 
French  French  Spanish  Spanish  Art 
Biology  Physics    Physics  Biology 

Edit: запрос был сделан, чтобы показать код здесь :

create table clsassin 

(

    ClassID int, 

    AssignID int, 

    ClsNm varchar(10), 

    StudntNm varchar(10), 

) 



insert into clsassin values (1, 1, 'Algebra', 'Tom') 

insert into clsassin values (1, 2, 'Algebra', 'Harry') 

insert into clsassin values (1, 3, 'Algebra', 'Mary') 

insert into clsassin values (1, 4, 'Algebra', 'Sue') 

insert into clsassin values (2, 5, 'Geometry', 'Paul') 

insert into clsassin values (3, 6, 'French', 'Harry') 

insert into clsassin values (3, 7, 'French', 'Tom') 

insert into clsassin values (4, 8, 'Spanish', 'Mary') 

insert into clsassin values (4, 9, 'Spanish', 'Sue') 

insert into clsassin values (5, 10, 'Art', 'Paul') 

insert into clsassin values (6, 11, 'Biology', 'Tom') 

insert into clsassin values (6, 12, 'Biology', 'Paul') 

insert into clsassin values (7, 13, 'Physics', 'Harry') 

insert into clsassin values (7, 14, 'Physics', 'Sue') 

insert into clsassin values (8, 15, 'History', 'Sue') 

DECLARE @cols AS NVARCHAR(MAX), 

    @query AS NVARCHAR(MAX) 



select @cols = STUFF((SELECT distinct ',' + QUOTENAME(StudntNm) 
        FROM clsassin 

FOR XML PATH(''), TYPE 

).value('.', 'NVARCHAR(MAX)') 

,1,1,'') 



set @query = 'SELECT ' + @cols + ' from 

    (

     select StudntNm, ClsNm 
, ClassID     
     from clsassin 

    ) x 

    pivot 

    (

     min(ClsNm) 

     for StudntNm in (' + @cols + ') 

    ) p ' 



execute(@query) 
+0

Пожалуйста, добавьте свой код в тело вопроса, полагаясь на сторонние ссылки, не рекомендуется. Ссылка может опуститься и оставить ваш вопрос неопровержимым – apaul

ответ

3

проблема с исходным запросом вы в том числе в classid в select список данных для PIVOT. У вас есть 8 различных значений classid, которые затем будут сгруппированы при применении агрегатной функции в точке поворота.

Проблема заключается в том, что если вы исключите ClassID и применять стержень, вы будете возвращать только одно значение каждого студента - тот, который соответствует min(ClsNm)

Поскольку вы хотите отобразить каждый класс для каждого студента, то вам следует рассмотреть возможность использования оконной функции row_number() вместо classid. Если вы примените row_number() и разделите данные на studntNm, то вы будете назначать инкрементное число для каждого класса для каждого учащегося, а затем, когда вы агрегируете данные, вы вернете каждую строку.

Код будет:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(StudntNm) 
        FROM clsassin 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT ' + @cols + ' 
      from 
      (
       select StudntNm, ClsNm, 
        row_number() over(partition by StudntNm 
             order by ClsNm) rn 
       from clsassin 
      ) x 
      pivot 
      (
       min(ClsNm) 
       for StudntNm in (' + @cols + ') 
      ) p ' 

execute sp_executesql @query; 

См SQL Fiddle with Demo. Это даст вам результат:

| HARRY | MARY |  PAUL |  SUE |  TOM | 
---------------------------------------------------- 
| Algebra | Algebra |  Art | Algebra | Algebra | 
| French | Spanish | Biology | History | Biology | 
| Physics | (null) | Geometry | Physics | French | 
| (null) | (null) | (null) | Spanish | (null) | 
+0

Большое спасибо за помощь bluefeet. Это выглядит великолепно! – user2603423

0

Я использовал этот метод для отображения сводной таблицы от продаж, таких как:

продукта, Jan2013, Feb2013, .....

Использования Метод XML PATH ('') возвращает все месяцы, но они не упорядочены. Могу ли я отсортировать их, чтобы они соответствовали правильной последовательности? Я прикрепил свой код ниже:

SET @cols = STUFF((SELECT distinct ',' + '[' + DATENAME(month,DateTime) + DATENAME(year,DateTime) +']' AS MonthYear 
       from DRGCase dc INNER JOIN Company c ON dc.HospitalId=c.CompanyId 
       WHERE dc.DischargeDate > @StartDate AND dc.DischargeDate <= DATEADD(DAY,1,@Enddate) 
       FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,''); 

SELECT @query='SELECT Hospital,' + @cols + 
    'FROM 
    (
    SELECT c.CompanyName AS Hospital, DATENAME(month,DateTime) + DATENAME(year,DateTime) AS MonthYear,COUNT(*) AS Cases 

    FROM DRGCase dc INNER JOIN Company c ON dc.HospitalId=c.CompanyId 

    WHERE dc.DischargeDate > ''' + CONVERT(CHAR(10),@StartDate,126) + ''' AND dc.DischargeDate <= DATEADD(DAY,1,''' + CONVERT(CHAR(10),@EndDate,126) + ''') 

    GROUP BY c.CompanyName, DATENAME(month,DateTime) + DATENAME(year,DateTime) 
    ) ps PIVOT 
    (
     sum(Cases) 
     FOR MonthYear IN (' + @cols + ') 
    ) 
    as pvt' 
exec(@query)