将分类值转换为布尔列 SQL
Posted
技术标签:
【中文标题】将分类值转换为布尔列 SQL【英文标题】:Pivot cateorical values into boolean columns SQL 【发布时间】:2012-08-16 10:56:33 【问题描述】:我正在寻找“扁平化”我的数据集以促进数据挖掘。 每个分类列应更改为多个布尔列。 我有一列包含分类值,例如:
ID col1
1 A
2 B
3 A
我正在寻找一种方法来旋转这个表,并有一个聚合函数告诉我这个 ID 的值是 A 还是 B:
结果:
ID col1A col1B
1 1 0
2 0 1
3 1 0
我尝试使用 PIVOT,但不知道在其中使用哪个聚合函数。
也在SF中寻找答案,但找不到...
我正在使用 MS-SQL 2012。
任何帮助将不胜感激! 暗里
编辑:
col1 中的类别数量未知,因此解决方案必须是动态的。 谢谢:)
【问题讨论】:
【参考方案1】:试试这个:
select ID,
col1A=(case when col1='A' then 1 else 0 end),
col1B=(case when col1='B' then 1 else 0 end)
from <table>
如果您有一个同时具有 A 和 B 的 ID,并且您希望在输出中具有不同的 ID,您可以这样做
select ID,
col1A=max(case when col1='A' then 1 else 0 end),
col1B=max(case when col1='B' then 1 else 0 end)
from <table>
group by id
编辑
根据您的评论,如果您不知道 col1 的选项数量,那么您可以选择动态 PIVOT
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(col1)
from <table>
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT id, ' + @cols + ' from <table>
pivot
(
count([col1])
for col1 in (' + @cols + ')
) p '
print(@query)
execute(@query)
SQL Fiddle Demo
【讨论】:
这个选项应该至少涵盖一个ID可以有A 和 B的可能性,因此有一个GROUP BY
,并且可能使用MAX()
。
谢谢!我只需要想出一种动态的方法,因为我不知道 col1 的选项数量。除了游标还有什么办法吗?
@Omri374:我已经更新了我对动态数据透视的查询。请立即查看以上是关于将分类值转换为布尔列 SQL的主要内容,如果未能解决你的问题,请参考以下文章
PySpark - ValueError:无法将列转换为布尔值
尝试将分类特征转换为数值时出现“ValueError:给定列不是数据框的列”