2017-01-11 31 views
3

我有4分列在我的表像:移调在SQL Server只几列

key  cusi    isi    name 
1  46644UAQ1   US46642EAV83  A 
1  46644UAR9   XS0062104145  A 
1  254206AC9       A        
2  05617YAJ8   US86359AXP38  B  
2  885220BP7       B 
2  null        B 
3  885220BP5   885220BP7345  c 

键和名称列的内容获得复制,因为CUSI和ISI列的。我想调换只有少数在这种情况下列cusi和isi列,以便我得到1记录id = 1和另一个为id = 2。在我的使用情况下,可以在最大3 ditinct cusi或3 isi列。

转置表想

key name cusi1  cusi2  cusi3  isi1   isi2   isi3 
    1 A 46644UAQ1 46644UAR9 254206AC9 US46642EAV83 XS0062104145 NULL 
    2 A 46644UAR9 05617YAJ8 885220BP7 US86359AXP38 NULL   NULL 
    3 c 885220BP5  null  null  885220BP7345 NULL   NULL 

在某些情况下,可能只有1行像在T例如他上面是关键= 3

我知道,SQL有PIVOT和UNPIVOT查询但我不知道如何使用它来转置表格的选择列 任何帮助将是非常有帮助的。 感谢

回答

0

如果你知道每个key - name集团将记录一个固定的数量(3,根据你给我们的样本数据),那么普通的非枢应该工作。在下面的查询中,我使用行号来区分结果集中cusiisi所需的三列中的每一列。

SELECT t.key, 
     t.name, 
     MAX(CASE WHEN t.rn = 1 THEN cusi END) AS cusi1, 
     MAX(CASE WHEN t.rn = 2 THEN cusi END) AS cusi2, 
     MAX(CASE WHEN t.rn = 3 THEN cusi END) AS cusi3, 
     MAX(CASE WHEN t.rn = 1 THEN isi END) AS isi1, 
     MAX(CASE WHEN t.rn = 2 THEN isi END) AS isi2, 
     MAX(CASE WHEN t.rn = 3 THEN isi END) AS isi3 
FROM 
(
    SELECT key, 
      cusi, 
      isi, 
      name, 
      ROW_NUMBER() OVER(PARTITION BY key ORDER BY cusi) AS rn 
    FROM yourTable 
) t 
GROUP BY t.key, 
     t.name 

注意,SQL Server还具有PIVOT功能,这是什么,我给了一个选择。

+0

在某些情况下,我不会有3行,我可能只有1行我该如何处理这个查询。我修改了我的用例,为此显示key = 3 – baiduXiu

+0

这应该不是问题,在这种情况下,您只需为这些缺少的行输入/ NULL条目。 –

+0

伟大的工作。感谢您的快速帮助 – baiduXiu