2015-03-18 2 views
0

Мне нужно преобразовать эту данную таблицу:несколько записей в одну строку

ArticleId | SymbolId 
-----------+---------- 
1   | 1 
1   | 2 
1   | 3 
2   | 6 
2   | 7 
2   | 3 
2   | 4 
2   | 5 

в другую таблицу, как это:

ArticleId | Symbol1 | Symbol2 | Symbol3 | Symbol4 | Symbol5 
-----------+-----------+----------+----------+----------+--------- 
1   | 1  | 2  | 3  | NULL  | NULL 
2   | 6  | 7  | 3  | 4  | 5 

есть простой способ сделать это? Всегда есть максимум 5 записей за ArticleId. Никакой специальный заказ не требуется.

ответ

2

Вы можете использовать MAX(CASE WHEN END):

;WITH YourTable(ArticleId, SymbolId) AS(
    SELECT 1, 1 UNION ALL 
    SELECT 1, 2 UNION ALL 
    SELECT 1, 3 UNION ALL 
    SELECT 2, 6 UNION ALL 
    SELECT 2, 7 UNION ALL 
    SELECT 2, 3 UNION ALL 
    SELECT 2, 4 UNION ALL 
    SELECT 2, 5 
) 
SELECT 
    ArticleId, 
    Symbol1 = MAX(CASE WHEN RN = 1 THEN SymbolId END), 
    Symbol2 = MAX(CASE WHEN RN = 2 THEN SymbolId END), 
    Symbol3 = MAX(CASE WHEN RN = 3 THEN SymbolId END), 
    Symbol4 = MAX(CASE WHEN RN = 4 THEN SymbolId END), 
    Symbol5 = MAX(CASE WHEN RN = 5 THEN SymbolId END) 
FROM(
    SELECT *, 
     RN = ROW_NUMBER() OVER(PARTITION BY ArticleId ORDER BY (SELECT NULL)) 
    FROM YourTable 
)t 
GROUP BY ArticleId 

Использование PIVOT

;WITH YourTable(ArticleId, SymbolId) AS(
    SELECT 1, 1 UNION ALL 
    SELECT 1, 2 UNION ALL 
    SELECT 1, 3 UNION ALL 
    SELECT 2, 6 UNION ALL 
    SELECT 2, 7 UNION ALL 
    SELECT 2, 3 UNION ALL 
    SELECT 2, 4 UNION ALL 
    SELECT 2, 5 
) 
SELECT 
    ArticleId, 
    Symbol1 = [1], 
    Symbol2 = [2], 
    Symbol3 = [3], 
    Symbol4 = [4], 
    Symbol5 = [5] 
FROM (
    SELECT *, 
     RN = ROW_NUMBER() OVER(PARTITION BY ArticleId ORDER BY (SELECT NULL)) 
    FROM YourTable 
)t 
PIVOT (
    MAX(t.SymbolId) 
    FOR RN IN ([1], [2], [3], [4], [5]) 
)p 
+0

Оба решения работают хорошо – VSDekar