--测试数据:
create table tb(分部 varchar(10) , 名称 varchar(10) , 数量 int)
insert into tb values('上海' , '语文' , 74)
insert into tb values('上海' , '数学' , 83)
insert into tb values('上海' , '物理' , 93)
insert into tb values('南京' , '语文' , 74)
insert into tb values('南京' , '数学' , 84)
insert into tb values('南京' , '物理' , 94)
go
--下面是查询语句
declare @sql varchar(8000)
set @sql = 'select 分部 '
select @sql = @sql + ' , sum(case 名称 when ''' + 名称 + ''' then 数量 else 0 end) [' + 名称 + ']'
from (select distinct 名称 from tb) as a
set @sql = @sql + ' from tb group by 分部'
exec(@sql)
要实现效果是
分部 数学 物理 语文
南京 84 94 74
上海 83 93 74
合计 167 187 148
关键是最后一行合计怎么来用sql语句完成查询。我的数据库环境是sql2000.
create table tb(分部 varchar(10) , 名称 varchar(10) , 数量 int)
insert into tb values('上海' , '语文' , 74)
insert into tb values('上海' , '数学' , 83)
insert into tb values('上海' , '物理' , 93)
insert into tb values('南京' , '语文' , 74)
insert into tb values('南京' , '数学' , 84)
insert into tb values('南京' , '物理' , 94)
go
--下面是查询语句
declare @sql varchar(8000)
set @sql = 'select 分部 '
select @sql = @sql + ' , sum(case 名称 when ''' + 名称 + ''' then 数量 else 0 end) [' + 名称 + ']'
from (select distinct 名称 from tb) as a
set @sql = @sql + ' from tb group by 分部'
exec(@sql)
要实现效果是
分部 数学 物理 语文
南京 84 94 74
上海 83 93 74
合计 167 187 148
关键是最后一行合计怎么来用sql语句完成查询。我的数据库环境是sql2000.
select @sql = isnull(@sql,'') + ',sum(case 名称 when ''' + 名称 + ''' then 数量 else 0 end) [' + 名称 + ']'
from (select distinct 名称 from tb) as a
set @sql = 'select 分部'+@sql + ' from tb group by 分部 union all select ''合计'''+@sql+' from tb'
exec(@sql)
declare @sql nvarchar(max),@col nvarchar(max)
select @sql=isnull(@sql+',','')+ quotename(名称) from tb group by 名称
select @col=isnull(@col+',sum(','sum(')+ quotename(名称)+')' from tb group by 名称
set @sql=';with cte as (select * from tb pivot (sum(数量) for sub in ('+@sql+'))a)
select * from cte union all select ''合计'','+@col+' from cte'
--select @sql
exec(@sql)
select [分部]
,max(case when [名称]='数学' then [数量] else 0 end) [数学]
,max(case when [名称]='物理' then [数量] else 0 end) [物理]
,max(case when [名称]='语文' then [数量] else 0 end) [语文]
from(
select [分部],[名称],'数量'=sum([数量]) from tb group by [分部],[名称]
union all
select '分部'='合计',[名称],'数量'=sum([数量]) from tb group by [名称]
)a group by [分部]
order by case when [分部]='合计' then 1 else 0 end--结果
分部 数学 物理 语文
---------- ----------- ----------- -----------
南京 84 94 74
上海 83 93 74
合计 167 187 148(3 行受影响)
declare @sql varchar(8000)
set @sql = 'select sno=identity(int,1,1),isnull(分部,''合计'') as 分部 '
select @sql = @sql + ' , sum(case 名称 when ''' + 名称 + ''' then 数量 else 0 end) [' + 名称 + ']'
from (select distinct 名称 from tb) as a
set @sql = @sql + ' into ##tmp from tb group by 分部 with rollup'
exec(@sql)select * from ##tmp
/**
sno 分部 数学 物理 语文
----------- ---------- ----------- ----------- -----------
1 南京 84 94 74
2 上海 83 93 74
3 合计 167 187 148(3 行受影响)
**/