Как я могу Pivot моей таблицы и разделить «агрегированные» поля запятой? - PullRequest
1 голос
/ 28 марта 2020

Я хотел бы сделать разворот моих данных.

Мой начальный запрос выглядит следующим образом:

SELECT 
      pre_memberidyominame  As FullName
      ,LocalizedLabel       AS 'Role'
      ,COALESCE(pre_salesorderid,pre_opportunityid)  AS ActivityGuid

  FROM [dbo].[pre_salesteammember]    STM
  LEFT JOIN OptionSetMetadata OS
    ON STM.pre_rolecode = OS.[Option]
    AND EntityName = 'pre_salesteammember'  

Результат:

FullName |    Role         |   ActivityGuid
Peter     Account Manager    1
Laura     Account Manager    1
Frank     Lead BDM           2
Tom       IT Manager         2
Sander    PR Specialist      3

Я бы хотел, чтобы фактический результат выглядел так:

Account Manager  |  Lead BDM   | ActivityGuid
Peter, Laura          NULL          1
NULL                  FRANK         2
NULL                  NULL          3   --> or could just be gone --> Last column should have Unique Values

Я пытался использовать PIVOT, но, похоже, не могу туда добраться! Любая помощь ?

1 Ответ

2 голосов
/ 28 марта 2020

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

select
    max(case when localizedlabel = 'Account Manager' then pre_memberidyominame end) account_manager,
    max(case when localizedlabel = 'Lead BDM' then pre_memberidyominame end) lead_bdm,
    coalesce(pre_salesorderid,pre_opportunityid)  as activityguid
from [dbo].[pre_salesteammember] stm
left join optionsetmetadata os
    on stm.pre_rolecode = os.[option]
    and entityname = 'pre_salesteammember'  
group by coalesce(pre_salesorderid,pre_opportunityid)

Если вы хотите агрегировать имена по действиям, вы можете использовать string_agg() вместо max() (доступно начиная с SQL Server 2017 ):

select
    string_agg(case when localizedlabel = 'Account Manager' then pre_memberidyominame end, ', ') account_manager,
    string_agg(case when localizedlabel = 'Lead BDM' then pre_memberidyominame end, ', ') lead_bdm,
    coalesce(pre_salesorderid,pre_opportunityid)  as activityguid
from [dbo].[pre_salesteammember] stm
left join optionsetmetadata os
    on stm.pre_rolecode = os.[option]
    and entityname = 'pre_salesteammember'  
group by coalesce(pre_salesorderid,pre_opportunityid)
...