将按位数据转换为多列
Convert bitwise data into multiple columns
我继承了需要清理的用户数据。它最初位于 MS Access 数据库中,我需要将其转换为 SQL 服务器。我现在在 SQL 服务器中有 table,但是有一列数据我需要帮助。
有很多列,例如姓名、电子邮件等,都非常简单。
但是,有一列存储按位数据。此列用于显示用户可以属于的组。通过查看大量记录,我确定这些组及其相关编号为:
All 1
Air 2
Plants 4
Energy 8
Land 16
Elec 32
Fire 64
Water 128
Cloud 256
Soil 512
Waste 1024
Local 2048
Coast 4096
user 列中的数据可以是 2,如果他们属于 Air 组,或者当他们同时属于 Air 和 Plants (2 + 4) 时,它可以是 6。
我创建了一个包含用户 ID 字段的 table。
User_ID
All
Air
Plants
Energy
Land
Elec
Fire
Water
Cloud
Soil
Waste
Local
Coast
所以我需要遍历旧的table,然后相应地在新的table的列中插入一个相应的真值
因此,如果数据是:
User_ID Name Group
1 Jo Smith 2
2 Carl White 8
我最终会得到
User_ID All Air Plants Energy ....
1 true
2 true
等等。
但是,由于用户可以属于多个组,因此数据看起来更像这样:
Jake C 1552
Jeff H 1556
Cath B 1561
Emma B 1564
Alex G 1572
Alan H 1574
Jo L 1596
Roy A 1600
我该如何构建我的新 table?我曾想过
SELECT * FROM [dbo].[Users] where [Group] & 2 != 0
会开始按照我需要的方式带回数据,但我不确定这是否正确。
编辑:如果需要的话,我愿意使用外部代码 - 不一定非要使用 SQL commands/queries
select user_id
,sign ([Group] & 1 ) as [All]
,sign ([Group] & 2 ) as [Air]
,sign ([Group] & 4 ) as [Plants]
,sign ([Group] & 8 ) as [Energy]
,sign ([Group] & 16 ) as [Land]
,sign ([Group] & 32 ) as [Elec]
,sign ([Group] & 64 ) as [Fire]
,sign ([Group] & 128 ) as [Water]
,sign ([Group] & 256 ) as [Cloud]
,sign ([Group] & 512 ) as [Soil]
,sign ([Group] & 1024) as [Waste]
,sign ([Group] & 2048) as [Local]
,sign ([Group] & 4096) as [Coast]
from [dbo].[Users]
或
select user_id
,sign ([Group] & power(2, 0)) as [All]
,sign ([Group] & power(2, 1)) as [Air]
,sign ([Group] & power(2, 2)) as [Plants]
,sign ([Group] & power(2, 3)) as [Energy]
,sign ([Group] & power(2, 4)) as [Land]
,sign ([Group] & power(2, 5)) as [Elec]
,sign ([Group] & power(2, 6)) as [Fire]
,sign ([Group] & power(2, 7)) as [Water]
,sign ([Group] & power(2, 8)) as [Cloud]
,sign ([Group] & power(2, 9)) as [Soil]
,sign ([Group] & power(2,10)) as [Waste]
,sign ([Group] & power(2,11)) as [Local]
,sign ([Group] & power(2,12)) as [Coast]
from [dbo].[Users]
select u.*
,[All] + [Air] + [Plants] + [Energy] + [Land] + [Elec] + [Fire] + [Water] + [Cloud] + [Soil] + [Waste] + [Local] + [Coast] as cnt
from (select user_id
,sign ([Group] & power(2, 0)) as [All]
,sign ([Group] & power(2, 1)) as [Air]
,sign ([Group] & power(2, 2)) as [Plants]
,sign ([Group] & power(2, 3)) as [Energy]
,sign ([Group] & power(2, 4)) as [Land]
,sign ([Group] & power(2, 5)) as [Elec]
,sign ([Group] & power(2, 6)) as [Fire]
,sign ([Group] & power(2, 7)) as [Water]
,sign ([Group] & power(2, 8)) as [Cloud]
,sign ([Group] & power(2, 9)) as [Soil]
,sign ([Group] & power(2,10)) as [Waste]
,sign ([Group] & power(2,11)) as [Local]
,sign ([Group] & power(2,12)) as [Coast]
from [dbo].[Users]
) u
;
我继承了需要清理的用户数据。它最初位于 MS Access 数据库中,我需要将其转换为 SQL 服务器。我现在在 SQL 服务器中有 table,但是有一列数据我需要帮助。
有很多列,例如姓名、电子邮件等,都非常简单。
但是,有一列存储按位数据。此列用于显示用户可以属于的组。通过查看大量记录,我确定这些组及其相关编号为:
All 1
Air 2
Plants 4
Energy 8
Land 16
Elec 32
Fire 64
Water 128
Cloud 256
Soil 512
Waste 1024
Local 2048
Coast 4096
user 列中的数据可以是 2,如果他们属于 Air 组,或者当他们同时属于 Air 和 Plants (2 + 4) 时,它可以是 6。
我创建了一个包含用户 ID 字段的 table。
User_ID
All
Air
Plants
Energy
Land
Elec
Fire
Water
Cloud
Soil
Waste
Local
Coast
所以我需要遍历旧的table,然后相应地在新的table的列中插入一个相应的真值
因此,如果数据是:
User_ID Name Group
1 Jo Smith 2
2 Carl White 8
我最终会得到
User_ID All Air Plants Energy ....
1 true
2 true
等等。
但是,由于用户可以属于多个组,因此数据看起来更像这样:
Jake C 1552
Jeff H 1556
Cath B 1561
Emma B 1564
Alex G 1572
Alan H 1574
Jo L 1596
Roy A 1600
我该如何构建我的新 table?我曾想过
SELECT * FROM [dbo].[Users] where [Group] & 2 != 0
会开始按照我需要的方式带回数据,但我不确定这是否正确。
编辑:如果需要的话,我愿意使用外部代码 - 不一定非要使用 SQL commands/queries
select user_id
,sign ([Group] & 1 ) as [All]
,sign ([Group] & 2 ) as [Air]
,sign ([Group] & 4 ) as [Plants]
,sign ([Group] & 8 ) as [Energy]
,sign ([Group] & 16 ) as [Land]
,sign ([Group] & 32 ) as [Elec]
,sign ([Group] & 64 ) as [Fire]
,sign ([Group] & 128 ) as [Water]
,sign ([Group] & 256 ) as [Cloud]
,sign ([Group] & 512 ) as [Soil]
,sign ([Group] & 1024) as [Waste]
,sign ([Group] & 2048) as [Local]
,sign ([Group] & 4096) as [Coast]
from [dbo].[Users]
或
select user_id
,sign ([Group] & power(2, 0)) as [All]
,sign ([Group] & power(2, 1)) as [Air]
,sign ([Group] & power(2, 2)) as [Plants]
,sign ([Group] & power(2, 3)) as [Energy]
,sign ([Group] & power(2, 4)) as [Land]
,sign ([Group] & power(2, 5)) as [Elec]
,sign ([Group] & power(2, 6)) as [Fire]
,sign ([Group] & power(2, 7)) as [Water]
,sign ([Group] & power(2, 8)) as [Cloud]
,sign ([Group] & power(2, 9)) as [Soil]
,sign ([Group] & power(2,10)) as [Waste]
,sign ([Group] & power(2,11)) as [Local]
,sign ([Group] & power(2,12)) as [Coast]
from [dbo].[Users]
select u.*
,[All] + [Air] + [Plants] + [Energy] + [Land] + [Elec] + [Fire] + [Water] + [Cloud] + [Soil] + [Waste] + [Local] + [Coast] as cnt
from (select user_id
,sign ([Group] & power(2, 0)) as [All]
,sign ([Group] & power(2, 1)) as [Air]
,sign ([Group] & power(2, 2)) as [Plants]
,sign ([Group] & power(2, 3)) as [Energy]
,sign ([Group] & power(2, 4)) as [Land]
,sign ([Group] & power(2, 5)) as [Elec]
,sign ([Group] & power(2, 6)) as [Fire]
,sign ([Group] & power(2, 7)) as [Water]
,sign ([Group] & power(2, 8)) as [Cloud]
,sign ([Group] & power(2, 9)) as [Soil]
,sign ([Group] & power(2,10)) as [Waste]
,sign ([Group] & power(2,11)) as [Local]
,sign ([Group] & power(2,12)) as [Coast]
from [dbo].[Users]
) u
;