Преобразовать значение каждого столбца, чтобы стать именем столбца - PullRequest
0 голосов
/ 13 октября 2019

Я думаю, что мой вопрос очень прост, и ответ тоже должен быть простым. Я просто хочу что-то вроде разворота на одном из моих трех столбцов. У меня есть запрос вроде этого:

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    

он возвращает некоторые записи для меня, как вы видите, теперь я хочу преобразовать результаттаким образом, что каждое значение столбца ReferenceTitle становится для себя столбцом, как показано ниже:

AgentId     ReferenceTitle1      ReferenceTitle2     ReferenceTitle3            
--------------------------------------------------------------------
AgentId1     PayementValue1      PayementValue2       PayementValue3
AgentId2         NULL            PayementValue4            NULL
AgentId3         NULL            PayementValue5       PayementValue6

Я только что нашел очень сложные результаты поиска, но я думаю, что должно быть простое решение. вы думаете, как я?

ОБНОВЛЕНИЕ

Я не знаю значений столбца ReferenceTitle, поэтому я не могу использовать эти значения в моем запросе.

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Вы можете использовать условное агрегирование:

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;
0 голосов
/ 13 октября 2019

наконец, я получил ответ, используя динамический пивот, как @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
...