2017-08-28 5 views
-4

によってテーブル「2値化」へ:どのようにテーブルの従業員がある。例えば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 
関連する問題