用条件将行转换为列?SQL服务器



我有一个包含以下数据的表,例如:

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

我试图把描述列中的每个值都变成自己的列,并显示一个"1"如果PersonID在其行中具有此值,并且只要该Description的EndDate为NULL,否则显示"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…同样,在我的查询中,我无法检查行是否具有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

相关内容

  • 没有找到相关文章

最新更新