--建立测试环境 Create table TEST (数据来源 Nvarchar(20), 使用级别 Nvarchar(20), 记录数 Int ) GO --插入数据 Insert TEST Values(N'读者库',N'VIP',10) Insert TEST Values(N'读者库',N'一般用户',3) Insert TEST Values(N'读者库',N'专家',8) Insert TEST Values(N'会员库',N'VIP',20) Insert TEST Values(N'会员库',N'专家',4) Insert TEST Values(N'资源库',N'专家',100) Insert TEST Values(N'资源库',N'一般用户',30) GO --测试 Select * from TEST--删除测试环境 Drop table TEST --结果 /* 数据来源 VIP 一般用户 专家 读者库 10 3 8 会员库 20 0 4 会员库 20 0 4 资源库 0 30 100*/
--如果你要在SELECT-GROUP取出的结果中处理,那就先把结果保存到临时表,然后再处理--假设下面是SELECT-GROUP取数据后保存的临时表 Create table #(数据来源 Nvarchar(20),使用级别 Nvarchar(20),记录数 Int) Insert # Values(N'读者库',N'VIP',10) Insert # Values(N'读者库',N'一般用户',3) Insert # Values(N'读者库',N'专家',8) Insert # Values(N'会员库',N'VIP',20) Insert # Values(N'会员库',N'专家',4) Insert # Values(N'资源库',N'专家',100) Insert # Values(N'资源库',N'一般用户',30)--对临时表中的数据做转换处理 declare @s nvarchar(4000) set @s='' select @s=@s+','+quotename(使用级别) +'=isnull(max(case 使用级别 when '+quotename(使用级别,'''') +' then 记录数 end),0)' from # group by 使用级别 exec('select 数据来源'+@s+' from # group by 数据来源') go--删除测试环境 Drop table #/*--结果数据来源 VIP 一般用户 专家 -------------------- ----------- ----------- ----------- 读者库 10 3 8 会员库 0 20 0 4 资源库 0 30 10 */
--应该用sub --对临时表中的数据做转换处理 declare @s nvarchar(4000) set @s='' select @s=@s+','+quotename(使用级别) +'=isnull(sum(case 使用级别 when '+quotename(使用级别,'''') +' then 记录数 end),0)' from # group by 使用级别 exec('select 数据来源'+@s+' from # group by 数据来源')
/* 一般来说,建议跳过SELECT-GROUP 直接从源表中取要转换为行头字段的数据,生成交叉列 然后再从源表中交叉查询数据 */--以sysobjects表查询为例,假设要查询name like 'sys%'的所有数据,列字段要求为status,行字段要求为xtype,统计其记录数--则用下面的语句: declare @s nvarchar(4000) set @s='' select @s=@s+','+quotename(xtype) +'=isnull(sum(case xtype when '+quotename(xtype,'''') +' then 1 end),0)' from sysobjects where name like 'sys%' group by xtype exec('select status'+@s+' from sysobjects where name like ''sys%'' group by status')/*--结果status S V ----------- ----------- ----------- -1610612736 0 2 -536870912 1 0 -536870911 4 0 -536870909 8 0 -536870907 1 0 -534773760 5 0 --*/
我的做法是,先把你的源表按照你想的group存放在一個新表 例如你的源表是tablea(name,a,b)你按你的group by 生成a(name,a,b) select * into a from tablea group by 條件 然後就參照以下行列轉換 declare @a varchar(1000) set @a='select name ' select @a=@a+',sum(case when a='''+a+''' then b end)'+' as '+ a ----這裡sum改為min或max結果一樣 from (select distinct a from a)T1 set @a=@a+'from #a group by name' exec(@a) ----------然後a表就是你所求的
Create table TEST
(数据来源 Nvarchar(20),
使用级别 Nvarchar(20),
记录数 Int
)
GO
--插入数据
Insert TEST Values(N'读者库',N'VIP',10)
Insert TEST Values(N'读者库',N'一般用户',3)
Insert TEST Values(N'读者库',N'专家',8)
Insert TEST Values(N'会员库',N'VIP',20)
Insert TEST Values(N'会员库',N'专家',4)
Insert TEST Values(N'资源库',N'专家',100)
Insert TEST Values(N'资源库',N'一般用户',30)
GO
--测试
Select * from TEST--删除测试环境
Drop table TEST
--结果
/*
数据来源 VIP 一般用户 专家
读者库 10 3 8
会员库 20 0 4
会员库 20 0 4
资源库 0 30 100*/
1 所取的任意两个字段类型不定,它们各自的不重复值是不固定的,可能有3种,也可能多种;
所有楼上建立临时test时其中的字段类型参数是不定的
还是请楼上贴出代码来看看吧
Create table #(数据来源 Nvarchar(20),使用级别 Nvarchar(20),记录数 Int)
Insert # Values(N'读者库',N'VIP',10)
Insert # Values(N'读者库',N'一般用户',3)
Insert # Values(N'读者库',N'专家',8)
Insert # Values(N'会员库',N'VIP',20)
Insert # Values(N'会员库',N'专家',4)
Insert # Values(N'资源库',N'专家',100)
Insert # Values(N'资源库',N'一般用户',30)--对临时表中的数据做转换处理
declare @s nvarchar(4000)
set @s=''
select @s=@s+','+quotename(使用级别)
+'=isnull(max(case 使用级别 when '+quotename(使用级别,'''')
+' then 记录数 end),0)'
from # group by 使用级别
exec('select 数据来源'+@s+' from # group by 数据来源')
go--删除测试环境
Drop table #/*--结果数据来源 VIP 一般用户 专家
-------------------- ----------- ----------- -----------
读者库 10 3 8
会员库 0 20 0 4
资源库 0 30 10
*/
--对临时表中的数据做转换处理
declare @s nvarchar(4000)
set @s=''
select @s=@s+','+quotename(使用级别)
+'=isnull(sum(case 使用级别 when '+quotename(使用级别,'''')
+' then 记录数 end),0)'
from # group by 使用级别
exec('select 数据来源'+@s+' from # group by 数据来源')
一般来说,建议跳过SELECT-GROUP
直接从源表中取要转换为行头字段的数据,生成交叉列
然后再从源表中交叉查询数据
*/--以sysobjects表查询为例,假设要查询name like 'sys%'的所有数据,列字段要求为status,行字段要求为xtype,统计其记录数--则用下面的语句:
declare @s nvarchar(4000)
set @s=''
select @s=@s+','+quotename(xtype)
+'=isnull(sum(case xtype when '+quotename(xtype,'''')
+' then 1 end),0)'
from sysobjects
where name like 'sys%'
group by xtype
exec('select status'+@s+' from sysobjects where name like ''sys%'' group by status')/*--结果status S V
----------- ----------- -----------
-1610612736 0 2
-536870912 1 0
-536870911 4 0
-536870909 8 0
-536870907 1 0
-534773760 5 0
--*/
例如你的源表是tablea(name,a,b)你按你的group by 生成a(name,a,b)
select * into a from tablea group by 條件
然後就參照以下行列轉換
declare @a varchar(1000)
set @a='select name '
select @a=@a+',sum(case when a='''+a+''' then b end)'+' as '+ a ----這裡sum改為min或max結果一樣
from (select distinct a from a)T1
set @a=@a+'from #a group by name'
exec(@a)
----------然後a表就是你所求的