2017-01-11 2 views
3

У меня есть 4 колонки в моей таблице как:Транспонирование только несколько колонн

key  cusi    isi    name 
1  46644UAQ1   US46642EAV83  A 
1  46644UAR9   XS0062104145  A 
1  254206AC9       A        
2  05617YAJ8   US86359AXP38  B  
2  885220BP7       B 
2  null        B 
3  885220BP5   885220BP7345  c 

содержание ключ и имя столбца становится дублируется из-за Куси и МСИ колонке .Я хотел бы перенести лишь немногие столбцы в этом случае столбцы cusi и isi, так что я получаю 1 запись id = 1 и еще одну для id = 2. В моем случае использования может быть максимум 3 ditinct cusi или 3 isi column.

Таблица транспонирования хотела

key name cusi1  cusi2  cusi3  isi1   isi2   isi3 
    1 A 46644UAQ1 46644UAR9 254206AC9 US46642EAV83 XS0062104145 NULL 
    2 A 46644UAR9 05617YAJ8 885220BP7 US86359AXP38 NULL   NULL 
    3 c 885220BP5  null  null  885220BP7345 NULL   NULL 

В некоторых случаях может быть только одна строка, как и в т он выше примера для ключа = 3

я знаю, что SQL имеет PIVOT и UNPIVOT запросов но я не уверен, как использовать его для переноса столбцов таблицы Любая помощь будет очень полезной. Благодаря

ответ

0

Если вы знаете, что каждый key - name группа будет иметь фиксированное количество записей (три, на основе данных образца вы дали нам), то обычный не стержень должен работать. В нижеприведенном запросе я использую номер строки, чтобы различать каждый из трех столбцов, которые вы хотите для cusi и isi в своем результирующем наборе.

SELECT t.key, 
     t.name, 
     MAX(CASE WHEN t.rn = 1 THEN cusi END) AS cusi1, 
     MAX(CASE WHEN t.rn = 2 THEN cusi END) AS cusi2, 
     MAX(CASE WHEN t.rn = 3 THEN cusi END) AS cusi3, 
     MAX(CASE WHEN t.rn = 1 THEN isi END) AS isi1, 
     MAX(CASE WHEN t.rn = 2 THEN isi END) AS isi2, 
     MAX(CASE WHEN t.rn = 3 THEN isi END) AS isi3 
FROM 
(
    SELECT key, 
      cusi, 
      isi, 
      name, 
      ROW_NUMBER() OVER(PARTITION BY key ORDER BY cusi) AS rn 
    FROM yourTable 
) t 
GROUP BY t.key, 
     t.name 

Обратите внимание, что SQL Server также имеет PIVOT функцию, которая является альтернативой, что я дал.

+0

В некоторых случаях у меня не будет 3 строки, у меня может быть только 1 строка, как я должен иметь дело с этим в этом запросе. я изменил свой вариант использования, чтобы показать key = 3 для этой цели. – baiduXiu

+0

Это не должно быть проблемой, в этом случае у вас будут только записи/NULL для этих недостающих строк. –

+0

отлично работает .thanks для быстрой помощи – baiduXiu

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