用于分隔列的SQL行

时间:2016-03-16 03:07:29

标签: sql sql-server

我意识到这可能与其他问题相似,但我被卡住了!

我无法将某些数据组织成适当的格式以导出到其他工具。基本上我有一个ID列,然后是2个响应列。我想将ID分开,然后列出每个ID下的响应。请参阅下面的示例以获得说明。

我玩过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')

2 个答案:

答案 0 :(得分:2)

您可以使用聚合和row_number()执行此操作。 。 。假设你提前知道了ids:

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表代表无序集。您的原始数据没有指示排序,因此无法保证将值与原始数据的顺序相同(实际上,没有这样的顺序是该声明是重言式)。如果您有另一个订单列,那么您可以使用它。

答案 1 :(得分:2)

以下是使用OUTER JOIN's

对Gordan的好答案的另一种方法

考虑到表格中有一个标识列,用于定义每个X1ID的顺序和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)