2011-12-14 3 views
3

У меня есть таблица, выполненном, как, например:Как повернуть строки в столбцы с известным максимальным числом столбцов

Pricing_Group

GroupID  | QTY 
TestGroup1 | 1 
TestGroup1 | 2 
TestGroup1 | 4 
TestGroup1 | 8 
TestGroup1 | 22 
TestGroup2 | 2 
TestGroup3 | 2 
TestGroup3 | 5 

Что я ищу это результат так:

Pricing_Group

GroupID  | QTY1 | QTY2 | QTY3 | QTY4 | QTY5 
TestGroup1 | 1  | 2  | 4  | 8  | 22 
TestGroup2 | 2  | NULL | NULL | NULL | NULL 
TestGroup3 | 2  | 5  | NULL | NULL | NULL 

Обратите внимание, что может быть только максимум различных величин для данного GroupID, просто не зная, что это за 5 величин.

Это похоже на приложение PIVOT, но я не могу полностью обернуть вокруг синтаксиса, который потребуется для приложения, подобного этому.

Спасибо, что нашли время, чтобы изучить это!

ответ

3

Вы можете поворачиваться на сгенерированном ранге;

;with T as (
    select 
     rank() over (partition by GroupID order by GroupID, QTY) as rank, 
     GroupID, 
     QTY 
    from 
     THE_TABLE 
) 
select 
    * 
from 
    T 
pivot (
    max(QTY) 
    for rank IN ([1],[2],[3],[4],[5]) 
) pvt 

>> 
GroupID  1  2  3  4  5 
---------------------------------------- 
TestGroup1 1  2  4  8  22 
TestGroup2 2  NULL NULL NULL NULL 
TestGroup3 2  5  NULL NULL NULL 
+0

Похоже, первый выбор оператор, который определяет ранг, возвращает значения рангов больше 5, когда количество равно 5 или выше, несмотря на то, что всего 5 общих значений. Затем они не отображаются в финальном стержне. – NickHeidke

+0

Можете ли вы расширить свой набор образцов? Он должен идти только выше 5, если существует 5 разных значений для одного и того же идентификатора группы –

+0

. Было добавлено дополнительное ключевое значение, которое мне нужно было добавить к разделу по инструкции, которая вызывала проблемы. Я не упоминал этот ключ выше, так что вы не могли бы это знать. Спасибо за помощь, это сработало фантастично! – NickHeidke

1

Вы можете также использовать случай заявление для выполнения шарнира:

declare @t table (GroupID varchar(25), QTY int) 
insert into @t 
    values ('TestGroup1', 1), 
      ('TestGroup1', 2), 
      ('TestGroup1', 4), 
      ('TestGroup1', 8), 
      ('TestGroup1', 22), 
      ('TestGroup2', 2), 
      ('TestGroup3', 2), 
      ('TestGroup3', 5) 

;with cte_Stage (r, GroupId, QTY) 
as ( select row_number() over(partition by GroupId order by QTY), 
       GroupId, 
       QTY 
     from @t 
    ) 
select GroupId, 
     [QTY1] = sum(case when r = 1 then QTY else null end), 
     [QTY2] = sum(case when r = 2 then QTY else null end), 
     [QTY3] = sum(case when r = 3 then QTY else null end), 
     [QTY4] = sum(case when r = 4 then QTY else null end), 
     [QTY5] = sum(case when r = 5 then QTY else null end), 
     [QTYX] = sum(case when r > 5 then QTY else null end) 
from cte_Stage 
group 
by  GroupId; 
4

Идеальный случай для поворота, и вы не нуждаетесь в КТР:

Declare @T Table (GroupID varchar(10) not null, 
    QTY int) 

Insert Into @T 
Values ('TestGroup1', 1), 
    ('TestGroup1', 2), 
    ('TestGroup1', 4), 
    ('TestGroup1', 8), 
    ('TestGroup1', 22), 
    ('TestGroup2', 2), 
    ('TestGroup3', 2), 
    ('TestGroup3', 5) 

Select GroupID, [QTY1], [QTY2], [QTY3], [QTY4], [QTY5] 
From (Select GroupID, QTY, 
    RowID = 'QTY' + Cast(ROW_NUMBER() Over (Partition By GroupID Order By QTY) as varchar) 
    from @T) As Pvt 
Pivot (Min(QTY) 
    For RowID In ([QTY1], [QTY2], [QTY3], [QTY4], [QTY5]) 
    ) As Pvt2 
Смежные вопросы