create table tb(时间 datetime,类别 varchar(10),数量 int)
insert into tb values('2007-10-11','Au1',100)
insert into tb values('2007-10-11','Au2',200)
insert into tb values('2007-10-11','Au3',300)
insert into tb values('2007-10-11','Au4',400)
insert into tb values('2007-11-11','Au1',200)
insert into tb values('2007-11-11','Au2',200)
insert into tb values('2007-11-11','Au3',200)
insert into tb values('2007-11-11','Au4',300)
go
declare @y as int
set @y = 2007--静态SQL,指类型只有Au1,Au2,Au3,Au4四种.
select convert(varchar(7),时间,120) 时间,
sum(case 类别 when 'Au1' then 数量 else 0 end) Au1,
sum(case 类别 when 'Au2' then 数量 else 0 end) Au2,
sum(case 类别 when 'Au3' then 数量 else 0 end) Au3,
sum(case 类别 when 'Au4' then 数量 else 0 end) Au4,
sum(数量) 合计
from tb
where datepart(year,时间) = @y
group by convert(varchar(7),时间,120)
union all
select convert(varchar(4),时间,120) 时间,
sum(case 类别 when 'Au1' then 数量 else 0 end) Au1,
sum(case 类别 when 'Au2' then 数量 else 0 end) Au2,
sum(case 类别 when 'Au3' then 数量 else 0 end) Au3,
sum(case 类别 when 'Au4' then 数量 else 0 end) Au4,
sum(数量) 合计
from tb
where datepart(year,时间) = @y
group by convert(varchar(4),时间,120)
/*
时间 Au1 Au2 Au3 Au4 合计
------- ----------- ----------- ----------- ----------- -----------
2007-10 100 200 300 400 1000
2007-11 200 200 200 300 900
(10至11合计) 300 400 500 700 1900
*/
如果12个月都有数据的话,我想用个时间来控制,比如输入2007-08,就计算出2007-01到2007-08的数据的合计,最后是这种效果
时间 Au1 Au2 Au3 Au4 合计
------- ----------- ----------- ----------- ----------- ----------- (10至11合计) 300 400 500 700 1900
一条数据,请各位帮帮忙!
insert into tb values('2007-10-11','Au1',100)
insert into tb values('2007-10-11','Au2',200)
insert into tb values('2007-10-11','Au3',300)
insert into tb values('2007-10-11','Au4',400)
insert into tb values('2007-11-11','Au1',200)
insert into tb values('2007-11-11','Au2',200)
insert into tb values('2007-11-11','Au3',200)
insert into tb values('2007-11-11','Au4',300)
go
declare @y as int
set @y = 2007--静态SQL,指类型只有Au1,Au2,Au3,Au4四种.
select convert(varchar(7),时间,120) 时间,
sum(case 类别 when 'Au1' then 数量 else 0 end) Au1,
sum(case 类别 when 'Au2' then 数量 else 0 end) Au2,
sum(case 类别 when 'Au3' then 数量 else 0 end) Au3,
sum(case 类别 when 'Au4' then 数量 else 0 end) Au4,
sum(数量) 合计
from tb
where datepart(year,时间) = @y
group by convert(varchar(7),时间,120)
union all
select convert(varchar(4),时间,120) 时间,
sum(case 类别 when 'Au1' then 数量 else 0 end) Au1,
sum(case 类别 when 'Au2' then 数量 else 0 end) Au2,
sum(case 类别 when 'Au3' then 数量 else 0 end) Au3,
sum(case 类别 when 'Au4' then 数量 else 0 end) Au4,
sum(数量) 合计
from tb
where datepart(year,时间) = @y
group by convert(varchar(4),时间,120)
/*
时间 Au1 Au2 Au3 Au4 合计
------- ----------- ----------- ----------- ----------- -----------
2007-10 100 200 300 400 1000
2007-11 200 200 200 300 900
(10至11合计) 300 400 500 700 1900
*/
如果12个月都有数据的话,我想用个时间来控制,比如输入2007-08,就计算出2007-01到2007-08的数据的合计,最后是这种效果
时间 Au1 Au2 Au3 Au4 合计
------- ----------- ----------- ----------- ----------- ----------- (10至11合计) 300 400 500 700 1900
一条数据,请各位帮帮忙!
insert into tb values( '2007-10-11 ', 'Au1 ',100)
insert into tb values( '2007-10-11 ', 'Au2 ',200)
insert into tb values( '2007-10-11 ', 'Au3 ',300)
insert into tb values( '2007-10-11 ', 'Au4 ',400)
insert into tb values( '2007-11-11 ', 'Au1 ',200)
insert into tb values( '2007-11-11 ', 'Au2 ',200)
insert into tb values( '2007-11-11 ', 'Au3 ',200)
insert into tb values( '2007-11-11 ', 'Au4 ',300)
go
declare @y1 as varchar(7)
set @y1 = '2007-08'
declare @y2 as varchar(7)
set @y2 = left(@y1,5) + '01'
--静态SQL,指类型只有Au1,Au2,Au3,Au4四种.
select convert(varchar(7),时间,120) 时间,
sum(case 类别 when 'Au1 ' then 数量 else 0 end) Au1,
sum(case 类别 when 'Au2 ' then 数量 else 0 end) Au2,
sum(case 类别 when 'Au3 ' then 数量 else 0 end) Au3,
sum(case 类别 when 'Au4 ' then 数量 else 0 end) Au4,
sum(数量) 合计
from tb
where convert(varchar(7),时间,120) between @y2 and @y1
group by convert(varchar(7),时间,120)
union all
select convert(varchar(4),时间,120) 时间,
sum(case 类别 when 'Au1 ' then 数量 else 0 end) Au1,
sum(case 类别 when 'Au2 ' then 数量 else 0 end) Au2,
sum(case 类别 when 'Au3 ' then 数量 else 0 end) Au3,
sum(case 类别 when 'Au4 ' then 数量 else 0 end) Au4,
sum(数量) 合计
from tb
where convert(varchar(7),时间,120) between @y2 and @y1
group by convert(varchar(4),时间,120)
/*
时间 Au1 Au2 Au3 Au4 合计
------- ----------- ----------- ----------- ----------- ----------- (所影响的行数为 0 行)
*/
create table tb(时间 datetime,类别 varchar(10),数量 int)
insert into tb values( '2007-10-11 ', 'Au1 ',100)
insert into tb values( '2007-10-11 ', 'Au2 ',200)
insert into tb values( '2007-10-11 ', 'Au3 ',300)
insert into tb values( '2007-10-11 ', 'Au4 ',400)
insert into tb values( '2007-11-11 ', 'Au1 ',200)
insert into tb values( '2007-11-11 ', 'Au2 ',200)
insert into tb values( '2007-11-11 ', 'Au3 ',200)
insert into tb values( '2007-11-11 ', 'Au4 ',300)
go
declare @y1 as varchar(7)
set @y1 = '2007-08'--静态SQL,指类型只有Au1,Au2,Au3,Au4四种.
select convert(varchar(7),时间,120) 时间,
sum(case 类别 when 'Au1 ' then 数量 else 0 end) Au1,
sum(case 类别 when 'Au2 ' then 数量 else 0 end) Au2,
sum(case 类别 when 'Au3 ' then 数量 else 0 end) Au3,
sum(case 类别 when 'Au4 ' then 数量 else 0 end) Au4,
sum(数量) 合计
from tb
where convert(varchar(7),时间,120) between left(@y1,5) + '01' and @y1
group by convert(varchar(7),时间,120)
union all
select convert(varchar(4),时间,120) 时间,
sum(case 类别 when 'Au1 ' then 数量 else 0 end) Au1,
sum(case 类别 when 'Au2 ' then 数量 else 0 end) Au2,
sum(case 类别 when 'Au3 ' then 数量 else 0 end) Au3,
sum(case 类别 when 'Au4 ' then 数量 else 0 end) Au4,
sum(数量) 合计
from tb
where convert(varchar(7),时间,120) between left(@y1,5) + '01' and @y1
group by convert(varchar(4),时间,120)
/*
时间 Au1 Au2 Au3 Au4 合计
------- ----------- ----------- ----------- ----------- ----------- (所影响的行数为 0 行)
*/ drop table tb