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
我希望获取单个列的值并将它们转换为每个 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 |