2015-06-30 2 views
1

База данных SQL Server, и у меня есть эта таблица:Как перенести таблицу в SQL

NODE | Param1 | Param2 | Param3 | Param4 | Param5 | 
----------------------------------------------------------------------- 
node1| some value | some value | some value | some value | some value | 
node2| some value | some value | some value | some value | some value | 
node3| some value | some value | some value | some value | some value | 
node4| some value | some value | some value | some value | some value | 

И я пытаюсь перенести это следующим образом:

PARAM | node1 | node2 | node3 | node4 | 
----------------------------------------------------------- 
Param1| some value | some value | some value | some value | 
Param2| some value | some value | some value | some value | 
Param3| some value | some value | some value | some value | 
Param4| some value | some value | some value | some value | 
Param5| some value | some value | some value | some value | 

Я пытаюсь использовать PIVOT, но не может сделать это правильный путь

Если я использую это:

SELECT 
    * 
FROM 
    (SELECT 
     NODE , 
     Param1 
    FROM 
     My_Table 
    ) TEMP 
PIVOT 
( 
MAX(Param1) FOR NODE IN (node1, node2, node3, node4) 
) PIV 

затем он переносит только один ряд

+1

Зачем идти от паршивого формата в другой мерзкий формат? Unpivot таблицы в одну с одной строкой на 'param' и' node'? –

+0

Хорошо, возможно, правильный путь - сначала отключить его, а затем использовать опорную точку – vladiz

ответ

3

Вы действительно должны попытаться исправить свои структуры таблиц. В любом случае, это один из способов сделать это, используя условную агрегацию.

SQL Fiddle

WITH CteUnpivot(node, val, param) AS(
    SELECT node, Param1, 'Param1' FROM tbl UNION ALL 
    SELECT node, Param2, 'Param2' FROM tbl UNION ALL 
    SELECT node, Param3, 'Param3' FROM tbl UNION ALL 
    SELECT node, Param4, 'Param4' FROM tbl UNION ALL 
    SELECT node, Param5, 'Param5' FROM tbl 
) 
SELECT 
    param, 
    node1 = MAX(CASE WHEN node = 'node1' THEN val END), 
    node2 = MAX(CASE WHEN node = 'node2' THEN val END), 
    node3 = MAX(CASE WHEN node = 'node3' THEN val END), 
    node4 = MAX(CASE WHEN node = 'node4' THEN val END), 
    node5 = MAX(CASE WHEN node = 'node5' THEN val END) 
FROM CteUnpivot 
GROUP BY param 
Смежные вопросы