2015-03-29 3 views
0

Я видел различные сообщения по Pivot или преобразовывал строки в столбцы, но все же мне не повезло с этим, поэтому я решил опубликовать вопрос.TSql Pivot or Row to Columns

Мой стол смещ_по_столбцам является

Id col_name 1 Serial 2 Data1 3 Data2

Моя таблица строки является

Id col_id value 1 1 1 2 1 2 3 1 3 4 2 25 5 2 26 6 2 27 7 3 28 8 3 29 9 3 30

Я хочу, чтобы результат, как показано ниже я думаю, с помощью UNPIVOT или поворота может работать. Из приходят должно быть что-то вроде -

Serial Data1 Data2 1 25 28 2 26 29 3 27 30

Любая помощь будет полезна.

+0

Вы можете разместить запрос, который вы пробовали до сих пор –

+0

, что именно связывает эти 2 таблицы? –

+0

не забудьте принять ответы, а также ваши более ранние вопросы –

ответ

0

Я не думаю, что pivot полезен здесь. Попробуйте

WITH cte1 
    AS (SELECT Row_number()OVER(ORDER BY Id) RN, 
       value   AS Data1 
     FROM yourtable 
     WHERE col_id = 1), 
    cte2 
    AS (SELECT Row_number()OVER(ORDER BY Id) RN, 
       value   AS Data2 
     FROM yourtable 
     WHERE col_id = 2), 
    cte3 
    AS (SELECT Row_number()OVER(ORDER BY Id) RN, 
       value   AS Data3 
     FROM yourtable 
     WHERE col_id = 3) 
SELECT Row_number()OVER(ORDER BY a.rn) AS serial, 
     Data1, 
     Data2, 
     Data3 
FROM cte1 A 
     FULL OUTER JOIN cte2 B 
        ON a.RN = b.RN 
     FULL OUTER JOIN cte3 C 
        ON b.RN = C.RN 
+0

ваше полное соединение должно включать CTE1 в обоих случаях. В противном случае вам не хватает данных, если в таблице b нет данных. Я также сделал бы первое полное присоединение к левому соединению –

+0

Эй, fireblade, ваше решение прямо на цель, но я думаю, мне нужно построить динамический sql, когда количество столбцов неизвестно. –

1

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

;WITH [rows] AS 
(
    SELECT id, value, col_id 
    FROM 
    (values 
    (1,1,1),(2,1,2), 
    (3,1,3),(4,2,25), 
    (5,2,26),(6,2,27), 
    (7,3,28),(8,3,29), 
    (9,3,30)) x(Id, col_id, value) 
), cols as 
(
    SELECT cols.id, col_name 
    FROM 
    (values 
     (2, 'Data1'),(3, 'Data2')) 
     cols(Id, col_name) 
), result as 
(
    SELECT row_number() OVER (partition by col_id order by [rows].id) rn, col_name, value 
    FROM 
    cols 
    JOIN 
    [rows] 
    ON [rows].col_id = cols.id 
    WHERE cols.id > 1 
) 
SELECT rn Serial, Data1, Data2 
FROM 
    result 
PIVOT 
(min([value]) 
FOR col_name 
in([Data1],[Data2]) 
)AS p 

Результат:

Serial Data1 Data2 
1  25 28 
2  26 29 
3  27 30