您可以通过使用数据透视得到您的结果和动态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
为什么你不正常化你的数据?否则,你将需要很多列代表所有可能的人类年龄... –
@bub我只是举一个例子。实际上,列值的范围不会很大。 – Deqing
_列值的范围不会很大_即使那样你的方法在技术上是错误的。 –