2016-03-16 6 views
1

Я понимаю, что это похоже на другие вопросы, но я застрял!Строки SQL для разделения столбцов

У меня возникли проблемы с организацией некоторых данных в соответствующем формате для экспорта в другой инструмент. В основном у меня есть столбец идентификатора, а затем 2 столбца ответа. Я хотел бы отделить идентификатор, а затем перечислить ответы по каждому из них. См. Пример ниже для уточнения.

Я играл с Pivot и UnPivot, но не могу понять это совершенно правильно.

Вот как выглядят данные сейчас.

ID X1 X2 
1 2 Y 
1 5 Y 
1 3 N 
1 7 N 
1 6 Y 
2 5 N 
2 4 Y 
2 8 Y 
2 3 N 
3 5 Y 
3 1 N 
3 9 N 

Вот как я хотел бы данные, чтобы посмотреть

ID1_X1 ID1_X2 ID2_X1 ID2_X2 ID3_X1 ID3_X2 
    2   Y   5   N   5   Y  
    5   Y   4   Y   1   N  
    3   N   8   Y   9   N  
    7   N   3   N   null  null 
    6   Y   null  null  null  null 

Вот код, чтобы создать/заполнить таблицу.

create table #test (ID int, X1 int, X2 varchar(1)) 

insert into #test values 
('1','2','Y'),('1','5','Y'),('1','3','N'),('1','7','N'), 
('1','6','Y'),('2','5','N'),('2','4','Y'),('2','8','Y'), 
('2','3','N'),('3','5','Y'),('3','1','N'),('3','9','N') 
+0

ли есть ли какой-либо другой столбец для определения * порядка * 'X1' в каждом' ID' –

+0

Какие РСУБД это? Добавьте тег, чтобы указать, используете ли вы 'mysql',' postgresql', 'sql-server',' oracle' или 'db2' - или что-то еще. –

+1

@marc_s добавили тег. –

ответ

2

Вы можете сделать это, используя агрегацию и row_number(). , , при условии, что вы знаете иды заранее:

select max(case when id = 1 then x1 end) as x1_1, 
     max(case when id = 1 then x2 end) as x2_1, 
     max(case when id = 2 then x1 end) as x1_2, 
     max(case when id = 2 then x2 end) as x2_2, 
     max(case when id = 3 then x1 end) as x1_3, 
     max(case when id = 3 then x2 end) as x2_3  
from (select t.*, 
      row_number() over (partition by id order by (select null)) a seqnum 
     from #test t 
    ) t 
group by seqnum; 

Следует отметить, что таблицы SQL представляют собой неупорядоченные множества. Ваши исходные данные не имеют указаний на заказ, поэтому это не гарантирует, что значения будут находиться в том же порядке, что и исходные данные (фактически, есть no такой порядок, что это утверждение является тавтологией). Если у вас есть другой столбец с заказом, вы можете использовать его.

+0

работает отлично, спасибо. –

2

Вот альтернативный подход к хорошему ответу Гордана, используя OUTER JOIN's

Учитывая, что есть столбец идентичности в таблице, чтобы определить порядок X1 в каждом ID и фиксированное количество ID's

;WITH FST 
    AS (SELECT ROW_NUMBER()OVER(ORDER BY IDENTITY_COL) RN,X1 AS ID1_X1,X2 AS ID1_X2 
     FROM #TEST A 
     WHERE ID = 1), 
    SCD 
    AS (SELECT ROW_NUMBER()OVER(ORDER BY IDENTITY_COL) RN,X1 AS ID2_X1,X2 AS ID2_X2 
     FROM #TEST A 
     WHERE ID = 2), 
    TRD 
    AS (SELECT ROW_NUMBER()OVER(ORDER BY IDENTITY_COL) RN,X1 AS ID3_X1,X2 AS ID3_X2 
     FROM #TEST A 
     WHERE ID = 3) 
SELECT ID1_X1,ID1_X2,ID2_X1,ID2_X2,ID3_X1,ID3_X2 
FROM FST A 
     FULL OUTER JOIN SCD B 
        ON A.RN = B.RN 
     FULL OUTER JOIN TRD C 
        ON C.RN = COALESCE(B.RN, A.RN) 
+0

Приняли ответ Гордона, однако я могу подтвердить, что это хорошо работает, если у вас есть уникальный идентификатор для каждой строки. Благодаря! –

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