在SQL Server中仅转置少量列

时间:2017-01-11 04:31:37

标签: sql-server sql-server-2012 pivot unpivot

我的表中有4列,如:

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行,如上例所示,它适用于key = 3

我知道sql有PIVOT和UNPIVOT查询,但我不知道如何使用它来转置选择表的列 任何帮助都会有很大的帮助。 感谢

1 个答案:

答案 0 :(得分:0)

如果您知道每个key - name组将拥有固定数量的记录(三个,基于您提供给我们的示例数据),那么普通的非透视图应该有效。在下面的查询中,我使用行号来区分结果集中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功能,这是我提供的替代功能。