2017-08-28 29 views
-4

表比如有一个Employee表:如何“双稳态”通过SQL

id gender age 
-------------------- 
1 Male  32 
2 Female 26 
3 Female 45 
4 NA  31 

我想创建另一个表并插入像数据:

id gender_Male gender_Female gender_NA age_26 age_31 age_32 age_45 
-------------------------------------------------------------------- 
1 1   0    0   0  0  1  0 
2 0   1    0   1  0  0  0   
3 0   1    0   0  0  0  1   
4 0   0    1   0  1  0  0   
+1

为什么你不正常化你的数据?否则,你将需要很多列代表所有可能的人类年龄... –

+0

@bub我只是举一个例子。实际上,列值的范围不会很大。 – Deqing

+0

_列值的范围不会很大_即使那样你的方法在技术上是错误的。 –

回答

0

使用CASE到指定各个领域无论是作为1或0

SELECT 
e.[id], 
CASE WHEN e.gender = 'Male' THEN 1 ELSE 0 END AS gender_Male, 
CASE WHEN e.gender = 'Female' THEN 1 ELSE 0 END AS gender_Female, 
CASE WHEN e.gender = 'NA' THEN 1 ELSE 0 END AS gender_NA 
INTO 
newTable 
FROM 
Employee e 
+0

感谢您的回答。是否可以自动生成列名?例如,如果另一条记录的性别为“未知”,则可以在不修改脚本的情况下创建一个“gender_unknown”列。 – Deqing

+1

是的,您需要动态SQL。这是一个经常被问到的问题,所以请在这里查看接受的答案:https://stackoverflow.com/questions/2554826/dynamic-sql-to-generate-column-names。如果您仍然有困难,请回复。 – cddt

0

enter image description here您可以通过使用数据透视得到您的结果和动态SQL -

Create table #Source (
id int , 
gender nvarchar(6) , 
Age tinyint) 
go 

insert into #Source 
select 1, 'Male' , 51 
union all select 2, 'Male' , 42 
union all select 4, 'Female' , 52 
union all select 5, 'Male' , 45 
union all select 6, 'Male' , 25 
union all select 7, 'Male' , 31 
union all select 8, 'NA' , 24 

declare @sql nvarchar(max) , @SelectList nvarchar(max) , @Pvt1 nvarchar(max) , @Pvt2 nvarchar(max) 

select @SelectList = 'id ,[Male] as [gender_Mail] ,Female as [gender_Female] , NA as [gender_NA] , ' , @Pvt1 = '' , @Pvt2 = '' 
select @SelectList = @SelectList + '[' + cast(age as varchar(3)) + '] as [age_' + cast(age as varchar(3)) + '] , ' from #Source 
select @SelectList = SUBSTRING(@SelectList ,1, LEN(@SelectList)-1) 

select @Pvt1 = ' [Male], [Female] , [NA]' 
select @Pvt2  = @Pvt2 + '[' + cast(age as varchar(3))+ '] , ' from #Source 
select @Pvt2 = SUBSTRING(@Pvt2 ,1, LEN(@Pvt2)-1) 

select @sql = N'select '[email protected]+ ' 
    from #Source s 
    PIVOT 
(
    count(gender) 
    FOR gender IN ('+ @Pvt1+ ') 
)AS pvt1 PIVOT 
(
    count(age) 
    FOR age IN (' + @Pvt2 + ') 
)AS pvt2' 

exec sp_executesql @sql