SQL - 将一列数据转置为一行

SQL - Transpose one column of data into a row

我希望获取单个列的值并将它们转换为每个 ClientGUID 的相应行。我所拥有的 post SELECT 语句的一个简单示例是:

ClientGUID DxCode
12345 50.8
12345 62.5
12345 42.1

如果可能的话,我想要完成的是:

ClientGUID DxCode1 DxCode2 DxCode3
12345 50.8 62.5 42.1

对于这个例子,我的 SELECT 语句看起来是这样的:

    SELECT ClientGUID, DxCode
    FROM MyTable
    WHERE ClientGUID = 12345

任何想法或方向将不胜感激!谢谢!

在这种类型的查询中,值的数量可能会有所不同,使用 STRING_AGG() 列出所有值通常更简单、更灵活。
我们可以选择值之间使用的分隔符。一个有趣的选项是使用换行符并将值显示为垂直列表。

SELECT
  ClientGUID,
  STRING_AGG(DxCode, ', ') DxCodes
FROM myTable
GROUP BY ClientGUID
ORDER BY ClientGUID;
ClientGUID | DxCodes            
---------: | :------------------
     12345 | 50.80, 62.50, 42.10

db<>fiddle here

您可以为此使用 PIVOT,例如:

;WITH src AS
(
  SELECT ClientGUID, DxCode,
    rn = ROW_NUMBER() OVER (PARTITION BY ClientGUID ORDER BY @@SPID)
  FROM dbo.ClientDxCodes
  -- WHERE ClientGUID = 12345
)
SELECT ClientGUID, DxCode1 = [1], DxCode2  = [2], DxCode3 = [3],
    DxCode4 = [4], DxCode5 = [5], DxCode6  = [6], DxCode7 = [7],
    DxCode8 = [8], DxCode9 = [9], DxCode10 = [10]
FROM src
PIVOT 
(
  MAX(DxCode) 
  FOR rn IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10])
) AS p;

输出:

ClientGUID DxCode1 DxCode2 DxCode3 DxCode4 DxCode5 DxCode6 DxCode7 DxCode8 DxCode9 DxCode10
12345 50.8 62.5 42.1 null null null null null null null