在SQL Server中仅转置几列

3

我的表格有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列,这样我就可以得到id=1的一条记录和id=2的另一条记录。在我的用例中,最多可能有3个不同的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
如果您知道每个 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 函数,它是我所提供的另一种选择。

在某些情况下,我可能没有三行,而只有一行。我该如何处理这个查询?我修改了我的用例以显示key = 3来达到这个目的。 - baiduXiu
这不应该成为问题,在这种情况下,您只需为那些缺失的行创建entry/NULL条目即可。 - Tim Biegeleisen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接