2017-01-11 2 views
-2

У меня есть таблица в SQL со следующими данными:преобразование таблицы в T-SQL столбцов к строкам

[col1] [col2] 
1  aabb 
2  ccdd 
3  eeff 
4  gghh 
1  uuii 
2  oopp 
3  hhjj 
4  lltt 
... 

Значение в col1 всегда известно. Как я могу преобразовать это в таблице, где значения первого столбца будут новые столбцы, как это:

[1] [2] [3] [4] 
aabb ccdd eeff gghh 
uuii oopp hhjj lltt 
... 
+1

Всегда ли 4 столбца? и ты что-нибудь пробовал? –

+1

Я попытался использовать точку поворота, но для поворота требуется использование функции агрегирования, и я не хочу собирать какие-либо данные. – Gnomo

+0

@Prdp. Это всегда фиксированное количество столбцов, но не всегда. 4 – Gnomo

ответ

2

Вы должны использовать Row_Number и Pivot/Conditional Aggregation

Если значения в col1 всегда знают то

;WITH cte 
     AS (SELECT Row_number()OVER(partition BY [col1] ORDER BY [col2]) rn, * 
      FROM Yourtable) 
SELECT [1] = Max(CASE WHEN [col1] = 1 THEN [col2] END), 
     [2] = Max(CASE WHEN [col1] = 2 THEN [col2] END), 
     [3] = Max(CASE WHEN [col1] = 3 THEN [col2] END), 
     [4] = Max(CASE WHEN [col1] = 4 THEN [col2] END) 
FROM cte 
GROUP BY rn 

Вот динамический подход

DECLARE @col_list VARCHAR(8000)= '', 
     @sql  VARCHAR(8000) 

SELECT @col_list = (SELECT DISTINCT ',' + Quotename([col1]) 
        FROM Yourtable 
        FOR xml path ('')) 

SET @col_list = Stuff(@col_list, 1, 1, '') 
SET @sql = 'select ' + @col_list 
      + ' from (SELECT Row_number()OVER(partition BY [col1] ORDER BY [col2]) rn, * 
       FROM Yourtable) a pivot (max([col2]) for col1 in (' 
      + @col_list + '))pv' 

PRINT @sql 

EXEC (@sql) 
Смежные вопросы