日期:2014-05-18  浏览次数:20500 次

请一个查询语句【附测试数据】
SQL code
[code=SQL]
go
if OBJECT_ID('report')is not null
drop table report
go
create table report(
销售员 varchar(10),
销售组 varchar(8),
产品名称 varchar(10),
产品组别 varchar(10),
销售金额 money,
销售日期 date,
)
go
insert report
select '周','A','产品1','产品甲组',10000,'2012-04-01' union all
select '王','B','产品2','产品乙组',0,'2012-04-03' union all
select '赵','B','产品1','产品甲组',50000,'2012-04-10' union all
select '李','C','产品3','产品甲组',30000,'2012-04-09' union all
select '孙','B','产品2','产品乙组',1,'2012-04-11' 
go
select * from report

--/**要求分别按销售人员和销售小组统计每种产品的个数、销售额、总额。
--/**每种产品只属于一个产品组,每个产品组有多个产品。
--/**实际数据有多个产品组和销售组。
--/**比如按小组统计,需如下结果(只说明格式):
/*
销售小组 产品甲组个数 产品甲组金额 产品乙组个数 产品乙组金额 总金额
A          3         30000        0            0      30000
B          0         0            2           200      200
.......
*/

[/code]

------解决方案--------------------
SQL code

go
if OBJECT_ID('report')is not null
drop table report
go
create table report(
销售员 varchar(10),
销售组 varchar(8),
产品名称 varchar(10),
产品组别 varchar(10),
销售金额 money,
销售日期 date,
)
go
insert report
select '周','A','产品1','产品甲组',10000,'2012-04-01' union all
select '王','B','产品2','产品乙组',0,'2012-04-03' union all
select '赵','B','产品1','产品甲组',50000,'2012-04-10' union all
select '李','C','产品3','产品甲组',30000,'2012-04-09' union all
select '孙','B','产品2','产品乙组',1,'2012-04-11' 
go
declare @str varchar(max)
set @str=''
select @str=@str+','+产品组别+'个数=sum(case when 产品组别='+QUOTENAME(产品组别,'''')+
' then 1 else 0 end),'+产品组别+'金额=sum(case when 产品组别='+QUOTENAME(产品组别,'''')+
' then 销售金额 else 0 end)' from report
group by 产品组别
exec('select 销售组'+@str+',sum(销售金额) as  总金额 from report group by 销售组')
--是你的结果有问题还是我的算法错误?不过我按照你的结果分析,不晓得是怎么回事。
/*
销售组    产品甲组个数    产品甲组金额    产品乙组个数    产品乙组金额    总金额
A    1    10000.00    0    0.00    10000.00
B    1    50000.00    2    1.00    50001.00
C    1    30000.00    0    0.00    30000.00
*/

--应该这样,楼上作废

------解决方案--------------------
SQL code

我那号被封了,换这个号,你试试下面的语句,我觉得不应该是quotename的问题
declare @str varchar(max)
set @str=''
select @str=@str+','+产品组别+'个数=sum(case when 产品组别='+'''产品组别'''+
' then 1 else 0 end),'+产品组别+'金额=sum(case when 产品组别='+'''产品组别'''+
' then 销售金额 else 0 end)' from report
group by 产品组别
exec('select 销售组'+@str+',sum(销售金额) as  总金额 from report group by 销售组')

------解决方案--------------------
declare @str varchar(max)
set @str='with t as (select 销售组'
select @str=@str+',sum(case when 产品组别='''+产品组别+'''
 then 1 else 0 end) '+rtrim(产品组别)+'个数'+',sum(case when 产品组别='''+产品组别+'''
 then 销售金额 else 0 end) '+rtrim(产品组别)+''+'金额' from report
group by 产品组别
set @str=@str+', sum(销售金额) as 总金额 from report group by 销售组) select *from t'
print @str
exec(@str)