IF OBJECT_ID('saleinfo') IS NOT NULL DROP TABLE saleinfo
--创建模拟表
create table saleinfo(
id int identity(1,1) primary key,
salesman nvarchar(50) null,
salemonth nvarchar(50) null,
achievement int
)
--载入模拟数据
insert into saleinfo (salesman,salemonth,achievement) values('A','1月5日',10)
insert into saleinfo (salesman,salemonth,achievement) values('A','1月7日',20)
insert into saleinfo (salesman,salemonth,achievement) values('A','2月4日',30)
insert into saleinfo (salesman,salemonth,achievement) values('A','2月7日',40)
insert into saleinfo (salesman,salemonth,achievement) values('A','3月2日',50)
insert into saleinfo (salesman,salemonth,achievement) values('A','3月9日',60)
insert into saleinfo (salesman,salemonth,achievement) values('B','1月5日',70)
insert into saleinfo (salesman,salemonth,achievement) values('B','1月7日',80)
insert into saleinfo (salesman,salemonth,achievement) values('B','2月4日',90)
insert into saleinfo (salesman,salemonth,achievement) values('B','2月7日',10)
insert into saleinfo (salesman,salemonth,achievement) values('B','3月2日',20)
insert into saleinfo (salesman,salemonth,achievement) values('B','3月9日',30)
insert into saleinfo (salesman,salemonth,achievement) values('C','1月5日',40)
insert into saleinfo (salesman,salemonth,achievement) values('C','1月7日',50)
insert into saleinfo (salesman,salemonth,achievement) values('C','2月4日',60)
insert into saleinfo (salesman,salemonth,achievement) values('C','2月7日',70)
insert into saleinfo (salesman,salemonth,achievement) values('C','3月2日',80)
insert into saleinfo (salesman,salemonth,achievement) values('C','3月9日',90)
--显示数据
select salesman as 业务员,salemonth as 月份,achievement as 业绩 from saleinfo
declare @sql varchar(8000)
set @sql = 'select salesman as 业务员'
select @sql = @sql + ' , sum(case left(salemonth,2) when ''' + left(salemonth,2) + ''' then achievement else 0 end) [' + left(salemonth,2) + ']'
from (select distinct left(salemonth,2) as salemonth from saleinfo) as a
set @sql = @sql + ' ,sum(achievement) as 业绩 from saleinfo group by salesman'
exec(@sql)
select 业务员,sum(decode(月份,'1月',1,0)*业绩) as 1月,
sum(decode(月份,'2月',1,0)*业绩) as 2月,
sum(decode(月份,'3月',1,0)*业绩) as 3月,
sum(业绩) as 总计
from (select 业务员,left(月份,2) as 月份, 业绩 from table)
group by 业务员
用SQL语句查询出业务员每个月的业绩和总计
可以使用一下两种方式来实现
1:使用case when then else end结构
参考代码:
select Uname,
sum(case when Umonth=1 then USales end) as 一月总销售额,
sum(case when Umonth=2 then USales end) as '二月总销售额',
sum(case when Umonth=3 then USales end) as '三月总销售额',
sum(case when Umonth=4 then USales end) as '四月总销售额',
sum(case when Umonth=5 then USales end) as '五月总销售额',
sum(case when Umonth=6 then USales end) as '六月总销售额',
sum(case when Umonth=7 then USales end) as '七月总销售额',
sum(case when Umonth=8 then USales end) as '八月总销售额',
sum(case when Umonth=9 then USales end) as '九月总销售额',
sum(case when Umonth=10 then USales end) as '十月总销售额',
sum(case when Umonth=11 then USales end) as '十一月总销售额',
sum(case when Umonth=12 then USales end) as '十二月总销售额'
from TestPivot
group by Uname
2:使用PIVOT
select Uname,
a.[1] as'一月总销售额',a.[2] as'二月总销售额',a.[3] as'三月总销售额',
a.[4] as'四月总销售额',a.[5] as'五月总销售额',a.[6] as'六月总销售额'
from TestPivot
PIVOT (SUM(USales) for Umonth
in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) as a
seclect 业务员
sum(decode(to_char(月份,'MM',),'1',nvl(业绩,0),0)1月,
sum(decode(to_char(月份,'MM',),'2',nvl(业绩,0),0)2月
sum(decode(to_char(月份,'MM',),'3',nvl(业绩,0),0)3月
from 表 group by 业务员
可能会有点问题,没有试过,有问题应该是头)to_char这里
select 业务员,月份,SUM(业绩) as 汇总
into #temp
from (
select 业务员,substring(月份,1,2) as 月份,业绩
from tb
)a
group by 业务员,月份,业绩
order by 业务员
select * from #temp pivot(sum(汇总) for 月份 in([1月],[2月],[3月]))a