2016-11-14 4 views
1

У меня есть унаследованные пользовательские данные, которые мне нужно дезинфицировать. Первоначально он был в базе данных MS Access, и мне нужно преобразовать его в SQL Server. У меня теперь есть таблица на SQL Server, но есть столбец данных, с которым мне нужна помощь.Преобразование побитовых данных в несколько столбцов

Существует несколько столбцов, таких как имя, адрес электронной почты и т. Д., Которые все довольно просто.

Однако имеется один столбец, в котором хранятся побитовые данные. Этот столбец должен показывать группы, к которым может принадлежать пользователь. Проходя через ряд записей я определил эти группы и связанные с ними число быть:

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 

Данные в столбце пользователя может быть 2, где они принадлежат к группе Air, или это может быть 6 когда они принадлежат как воздуху, так и растениям (2 + 4).

Я создал таблицу, которая содержит поле идентификатора пользователя.

User_ID 
All 
Air 
Plants 
Energy 
Land 
Elec 
Fire 
Water 
Cloud 
Soil 
Waste 
Local 
Coast 

Поэтому мне нужно перебирать старую таблицу, а затем вставить соответствующее истинное значение в столбцах новой таблицы соответственно

Таким образом, если данные:

User_ID Name  Group 
     1 Jo Smith  2 
     2 Carl White  8 

I будет в конечном итоге

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 

Как идти о создании моего нового стола? Я думал что-то вдоль линий

SELECT * FROM [dbo].[Users] where [Group] & 2 != 0 

бы начать возвращение данных по линиям, что мне нужно, но я не уверен, что это правильный путь.

Edit: Я открыт для использования внешнего кода, если это то, что требуется - не обязательно должно быть сделано с помощью команд SQL/запросов

ответ

3
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 
; 
+0

Ничего себе. Спасибо! –

+0

Было бы возможно добавить столбец со списком выбранных групп, поэтому, если бы у Карла был Air и Plants, счет был бы равен 2? –

+0

@MhluziBhaka, см. Внизу отредактированного ответа –

Смежные вопросы