将行转换为具有条件的列? 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
我有 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