将每个列值转换为列名
Convert Each Column Value To Become A Column Name
我觉得我的问题很简单,答案也一定很简单。我只想在我的三个专栏之一上使用类似枢轴的东西。
我有这样的查询:
SELECT AgentId, ReferenceTitle, PaymentValue FROM AgentPayments WHERE PaymentValue > 0
结果将是这样的:
AgentId ReferenceTitle PaymentValue
---------------------------------------------------
AgentId1 ReferenceTitle1 PayementValue1
AgentId1 ReferenceTitle2 PayementValue2
AgentId1 ReferenceTitle3 PayementValue3
AgentId2 ReferenceTitle2 PayementValue4
AgentId3 ReferenceTitle2 PayementValue5
AgentId3 ReferenceTitle3 PayementValue6
它 returns 如您所见,我有一些记录,现在我想转换结果,使列 'ReferenceTitle' 的每个值都成为自己的一列,如下所示:
AgentId ReferenceTitle1 ReferenceTitle2 ReferenceTitle3
--------------------------------------------------------------------
AgentId1 PayementValue1 PayementValue2 PayementValue3
AgentId2 NULL PayementValue4 NULL
AgentId3 NULL PayementValue5 PayementValue6
我刚刚通过搜索找到了非常复杂的结果,但我认为必须有一个简单的解决方案。
你觉得和我一样吗?
更新
我不知道 'ReferenceTitle' 列的值,所以我不能在查询中使用这些值。
您可以使用条件聚合:
SELECT AgentId,
MAX(CASE WHEN ReferenceTitle='ReferenceTitle1' THEN PaymentValue END) AS ReferenceTitle1,
MAX(CASE WHEN ReferenceTitle='ReferenceTitle2' THEN PaymentValue END) AS ReferenceTitle2,
MAX(CASE WHEN ReferenceTitle='ReferenceTitle3' THEN PaymentValue END) AS ReferenceTitle3
FROM tab
GROUP BY AgentId;
最后,我像@lukasz 说的那样使用动态枢轴找到了答案,
至少它没有我预期的那么复杂:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT ',' + QUOTENAME(ReferenceTitle)
FROM AgentPayments
WHERE PaymentValue > 0
GROUP BY ReferenceTitle
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SELECT @query = '
SELECT * FROM
(
SELECT
AgentId, ReferenceTitle, PaymentValue
FROM AgentPayments
) X
PIVOT
(
MAX(PaymentValue)
for ReferenceTitle in ('+@cols+')
) P'
EXEC SP_EXECUTESQL @query
我觉得我的问题很简单,答案也一定很简单。我只想在我的三个专栏之一上使用类似枢轴的东西。 我有这样的查询:
SELECT AgentId, ReferenceTitle, PaymentValue FROM AgentPayments WHERE PaymentValue > 0
结果将是这样的:
AgentId ReferenceTitle PaymentValue
---------------------------------------------------
AgentId1 ReferenceTitle1 PayementValue1
AgentId1 ReferenceTitle2 PayementValue2
AgentId1 ReferenceTitle3 PayementValue3
AgentId2 ReferenceTitle2 PayementValue4
AgentId3 ReferenceTitle2 PayementValue5
AgentId3 ReferenceTitle3 PayementValue6
它 returns 如您所见,我有一些记录,现在我想转换结果,使列 'ReferenceTitle' 的每个值都成为自己的一列,如下所示:
AgentId ReferenceTitle1 ReferenceTitle2 ReferenceTitle3
--------------------------------------------------------------------
AgentId1 PayementValue1 PayementValue2 PayementValue3
AgentId2 NULL PayementValue4 NULL
AgentId3 NULL PayementValue5 PayementValue6
我刚刚通过搜索找到了非常复杂的结果,但我认为必须有一个简单的解决方案。 你觉得和我一样吗?
更新
我不知道 'ReferenceTitle' 列的值,所以我不能在查询中使用这些值。
您可以使用条件聚合:
SELECT AgentId,
MAX(CASE WHEN ReferenceTitle='ReferenceTitle1' THEN PaymentValue END) AS ReferenceTitle1,
MAX(CASE WHEN ReferenceTitle='ReferenceTitle2' THEN PaymentValue END) AS ReferenceTitle2,
MAX(CASE WHEN ReferenceTitle='ReferenceTitle3' THEN PaymentValue END) AS ReferenceTitle3
FROM tab
GROUP BY AgentId;
最后,我像@lukasz 说的那样使用动态枢轴找到了答案, 至少它没有我预期的那么复杂:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT ',' + QUOTENAME(ReferenceTitle)
FROM AgentPayments
WHERE PaymentValue > 0
GROUP BY ReferenceTitle
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SELECT @query = '
SELECT * FROM
(
SELECT
AgentId, ReferenceTitle, PaymentValue
FROM AgentPayments
) X
PIVOT
(
MAX(PaymentValue)
for ReferenceTitle in ('+@cols+')
) P'
EXEC SP_EXECUTESQL @query