我有一个包含以下数据的表,例如:
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