将行转换为具有条件的列? SQL 服务器

Turning rows into columns with a condition? SQL Server

我有 table1,例如以下数据:

PersonID        Description        StartDate          EndDate
---------------------------------------------------------
ABC             Do not call        2000-05-10         NULL
ABC             Do not solicit     2005-10-15         NULL
XYZ             Do not email       2010-12-20         NULL
FGH             Do not contact     2020-10-11         2021-12-11

我正在尝试将 Description 列中的每个值都变成它自己的列,并在 PersonID 在其行中具有此值且只要该 Description 的 EndDate 为 NULL 时显示“1” , 否则显示 "0" 例如:

PersonID          Do Not Call       Do Not Solicit      Do not email        Do not contact
---------------------------------------------------------------------------------------------
ABC                   1                   1                 0                     0
XYZ                   0                   0                 1                     0
FGH                   0                   0                 0                     0         

我试过使用 PIVOT,例如:

SELECT PersonID, [Do not call], [Do not call solicit], [Do not email], [Do not contact]
from table1 as SourceTable
PIVOT
(
COUNT(Description)
for Description IN ([Do not call], [Do not call solicit], [Do not email], [Do not contact])
) as PivotTable

但这给了我相同 PersonID 的多行,而我只想要一个唯一的 PersonID 行,然后在“请勿致电”、“请勿征求”的其余列中只需要 1 或 0 的值, ETC... 同样对于我的查询,我无法检查该行是否具有 EndDate,因为如果它确实具有 EndDate 值,那么我希望它显示 0 而不是 1。

我会选择使用条件聚合而不是数据透视表。另外,我建议不要在您的列名中放置空格,因为这只会增加使用难度并且没有任何实际好处。

select PersonID
    , DoNotCall = MAX(case when Description = 'Do Not Call' then 1 end)
    , DoNotSolicit = MAX(case when Description = 'Do Not Solicit' then 1 end)
    , DoNotEmail = MAX(case when Description = 'Do not email' then 1 end)
    , DoNotContact = MAX(case when Description = 'Do not contact' then 1 end)
from table1
group by PersonID
group by PersonID