2016-06-20 4 views
0

У меня есть следующая таблица в моем сервере MS SQL:MS SQL: Pivot/транспозиции таблица

User | Item | Date 
1 | A | 2015-03-01 
1 | B | 2015-03-03 
1 | C | 2015-03-02 
1 | A | 2015-03-05 
2 | C | 2015-03-01 
2 | C | 2015-03-03 
2 | B | 2015-03-02 

И эта таблица должна быть объединены/повернута/транспонировать в этом:

User | 1st_item | 2nd_item | 3rd_item | 4th_item 
1 | A  | C  | B  | A 
2 | C  | B  | C  | NULL 

(The порядок элементов определяется датой в исходных данных.) К сожалению, я не знаю, как туда добраться ... В идеале решение также будет работать для гибкого количества элементов (не фиксировано на 4, как в примере).

То, что я пытался до сих пор:

  • Я использовал row_number() OVER (PARTITION BY пользователя ORDER BY даты), чтобы создать столбец дает мне заказ в пределах элементов каждого пользователя
  • Я попытался с помощью PIVOT - но здесь я не знаю, как получить элементы в столбцы, добавленные этой командой

Спасибо за любую помощь и/или подсказку заранее!

+1

может ли быть более 4-х элементов на пользователе? –

+0

Может быть больше 4. Но на данный момент было бы нормально ограничить его 4 ... – Daniel

+0

Ну, вы можете попробовать сделать это с помощью 'ROW_NUMBER()', как вы предлагали, и объединить его с условной агрегацией: 'SELECT t.user, MAX (CASE WHEN t.rnk = 1 THEN t.item END) как 1st_item, MAX (CASE WHEN t.rnk = 2 THEN t.item END) как 2nd_item, MAX (CASE WHEN t .rnk = 3 THEN t.item END) как 3rd_item FROM (SELECT s. *, ROW_NUMBER() OVER (PARTITION by s.user ORDER BY s.date) как rnk FROM YourTable s) GROUP BY t.user ' – sagi

ответ

0

пример кронштейне

SELECT [User], 
     [1] AS [1st_item], 
     [2] AS [2nd_item], 
     [3] AS [3rd_item], 
     [4] AS [4th_item] 
FROM (SELECT [User], 
       [Item], 
       ROW_NUMBER() OVER (PARTITION BY [User] ORDER BY [Date]) Rn 
     FROM myTable) mt 
PIVOT (
    MAX([Item]) 
    FOR Rn IN ([1],[2],[3],[4]) 
) p 
+0

Спасибо - также это решает мою проблему! Когда я попробовал это, я использовал AVG или SUM вместо MAX, который затем не работал с строкой элемента ... – Daniel

Смежные вопросы