技术难点,敬请zjcxc (邹建) ,txlicenhe(马可)等高手解救!!!!!!!!

small_pig 2004-01-07 09:01:58
有两个表如下:

a表
[产品编号] [产品名称] [产品种类]
1001 a01 a
1002 a02 a
1003 a03 a
1004 b01 b
1005 b02 b
1006 b03 b

b表
[客户编号] [产品编号] [数量] [时间]
001 1001 100 2003-07-18
001 1003 200 2003-11-02
001 1005 60 2003-12-06
002 1002 30 2003-01-01
002 1005 500 2003-12-07
003 1003 70 2003-02-05
003 1004 500 2003-06-02
003 1006 20 2003-06-02
004 1002 110 2003-02-09
005 1001 22 2003-03-07
005 1006 20 2003-06-01

要根据一下两个条件生成一张报表
条件1:时间:_____年______月至_____年_____月
条件2: 产品种类(全部,a,b)
报表内容:
[产品名称 时间] [1月] [2月] [3月] [4月] [...] [合计]
。。
。。
。。
[合计]。。。

敬请高手出手解救。
...全文
24 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
DigJim 2004-01-08
  • 打赏
  • 举报
回复
假如跨年要用存储过程来写了!
zjcxc 元老 2004-01-08
  • 打赏
  • 举报
回复
--下面是测试

--测试数据
create table a表([产品编号] varchar(4),[产品名称] varchar(10),[产品种类] varchar(1))
insert into a表
select '1001','a01','a'
union all select '1002','a02','a'
union all select '1003','a03','a'
union all select '1004','b01','b'
union all select '1005','b02','b'
union all select '1006','b03','b'

create table b表([客户编号] varchar(3),[产品编号] varchar(4),[数量] int,[时间] datetime)
insert into b表
select '001','1001',100,'2003-07-18'
union all select '001','1003',200,'2003-11-02'
union all select '001','1005',60,'2003-12-06'
union all select '002','1002',30,'2003-01-01 '
union all select '002','1005',500,'2003-12-07'
union all select '003','1003',70,'2003-02-05'
union all select '003','1004',500,'2003-06-02'
union all select '003','1006',20,'2003-06-02'
union all select '004','1002',110,'2003-02-09'
union all select '005','1001',22,'2003-03-07'
union all select '005','1006',20,'2003-06-01'
go

--处理的存储过程
create proc p_qry
@开始年月 varchar(6), --查询的开始年月,格式:YYYYMM
@结束年月 varchar(6)=null, --查询的结束年月,如果不指定(NULL),则与结束年月相同
@产品种类 varchar(10)='<全部>' --查询的产品种类,为<全部>是,不限制产品种类
as
set nocount on
declare @s varchar(8000),@tj varchar(1000)
,@d1 datetime,@d2 datetime,@i int

select @s=''
,@d1=@开始年月+'01'
,@d2=dateadd(month,1,isnull(@结束年月,@开始年月)+'01')
,@tj=case @产品种类 when '<全部>' then ''
else 'where 产品种类='''+@产品种类+'''' end

select @s=@s+',['+left(dt,4)+'年'+right(dt,2)+'月]=sum(case 时间 when '''
+dt+''' then 数量 else 0 end)'
from(
select dt=convert(varchar(6),dateadd(month,a.id+b.id,@d1),112)
from(
select id=0 union all select 1 union all select 2
union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8
union all select 9 union all select 10 union all select 11
) a,(select id=0 union all select 12 union all select 24
union all select 36 union all select 48 union all select 60
union all select 72 union all select 84 union all select 96
union all select 108 union all select 120 union all select 132
) b where (a.id+b.id)<datediff(month,@d1,@d2)
) a

exec('select 产品名称=case grouping(产品名称) when 1 then ''合计'' else 产品名称 end
'+@s+',合计=sum(数量)
from(
select a.产品名称,b.数量,时间=convert(varchar(6),b.时间,112)
from a表 a join b表 b on a.产品编号=b.产品编号
'+@tj+'
) a group by 产品名称 with rollup')
go

--调用示例
exec p_qry '200311','200402'
go

--删除测试
drop proc p_qry
drop table a表,b表

/*--测试结果
产品名称 2003年11月 2003年12月 2004年01月 2004年02月 合计
---------- ----------- ----------- ----------- ----------- -----------
a01 0 0 0 0 122
a02 0 0 0 0 140
a03 200 0 0 0 270
b01 0 0 0 0 500
b02 0 560 0 0 560
b03 0 0 0 0 40
合计 200 560 0 0 1632
--*/
zjcxc 元老 2004-01-08
  • 打赏
  • 举报
回复
--上面的漏了合计,改一下:

/*--用下面的存储过程

考虑到跨年,生成的格式为,处理的最大年月跨度为144个月(可以调整序数表来增加跨度):
[产品名称] [开始年月]... [结束年月][合计]

--*/

create proc p_qry
@开始年月 varchar(6), --查询的开始年月,格式:YYYYMM
@结束年月 varchar(6)=null, --查询的结束年月,如果不指定(NULL),则与结束年月相同
@产品种类 varchar(10)='<全部>' --查询的产品种类,为<全部>是,不限制产品种类
as
set nocount on
declare @s varchar(8000),@tj varchar(1000)
,@d1 datetime,@d2 datetime,@i int

select @s=''
,@d1=@开始年月+'01'
,@d2=dateadd(month,1,isnull(@结束年月,@开始年月)+'01')
,@tj=case @产品种类 when '<全部>' then ''
else 'where 产品种类='''+@产品种类+'''' end

select @s=@s+',['+left(dt,4)+'年'+right(dt,2)+'月]=sum(case 时间 when '''
+dt+''' then 数量 else 0 end)'
from(
select dt=convert(varchar(6),dateadd(month,a.id+b.id,@d1),112)
from(
select id=0 union all select 1 union all select 2
union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8
union all select 9 union all select 10 union all select 11
) a,(select id=0 union all select 12 union all select 24
union all select 36 union all select 48 union all select 60
union all select 72 union all select 84 union all select 96
union all select 108 union all select 120 union all select 132
) b where (a.id+b.id)<datediff(month,@d1,@d2)
) a

exec('select 产品名称=case grouping(产品名称) when 1 then ''合计'' else 产品名称 end
'+@s+',合计=sum(数量)
from(
select a.产品名称,b.数量,时间=convert(varchar(6),b.时间,112)
from a表 a join b表 b on a.产品编号=b.产品编号
'+@tj+'
) a group by 产品名称 with rollup')
go

exec p_qry '200301','200302'
go
zjcxc 元老 2004-01-08
  • 打赏
  • 举报
回复
/*--用下面的存储过程

考虑到跨年,生成的格式为,处理的最大年月跨度为144个月(可以调整序数表来增加跨度):
[产品名称] [开始年月]... [结束年月][合计]

--*/

create proc p_qry
@开始年月 varchar(6), --查询的开始年月,格式:YYYYMM
@结束年月 varchar(6)=null, --查询的结束年月,如果不指定(NULL),则与结束年月相同
@产品种类 varchar(10)='<全部>' --查询的产品种类,为<全部>是,不限制产品种类
as
set nocount on
declare @s varchar(8000),@tj varchar(1000)
,@d1 datetime,@d2 datetime,@i int

select @s=''
,@d1=@开始年月+'01'
,@d2=dateadd(month,1,isnull(@结束年月,@开始年月)+'01')
,@tj=case @产品种类 when '<全部>' then ''
else 'where 产品种类='''+@产品种类+'''' end

select @s=@s+',['+left(dt,4)+'年'+right(dt,2)+'月]=sum(case 时间 when '''
+dt+''' then 数量 else 0 end)'
from(
select dt=convert(varchar(6),dateadd(month,a.id+b.id,@d1),112)
from(
select id=0 union all select 1 union all select 2
union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8
union all select 9 union all select 10 union all select 11
) a,(select id=0 union all select 12 union all select 24
union all select 36 union all select 48 union all select 60
union all select 72 union all select 84 union all select 96
union all select 108 union all select 120 union all select 132
) b where (a.id+b.id)<datediff(month,@d1,@d2)
) a

exec('select 产品名称'+@s+'
from(
select a.产品名称,b.数量,时间=convert(varchar(6),b.时间,112)
from a表 a join b表 b on a.产品编号=b.产品编号
'+@tj+'
) a group by 产品名称')
go

exec p_qry '200301','200311'
go
txlicenhe 2004-01-08
  • 打赏
  • 举报
回复
楼主,请给出跨年的内容应该是什么结果。
small_pig 2004-01-07
  • 打赏
  • 举报
回复
请大家看看条件的阿:条件1:时间:_____年______月至_____年_____月
说明时间是动态的
small_pig 2004-01-07
  • 打赏
  • 举报
回复
playyuer(双规干部),有什么报表工具阿,请指教
Jianli2004 2004-01-07
  • 打赏
  • 举报
回复
where ...
Jianli2004 2004-01-07
  • 打赏
  • 举报
回复

select a.产品名称,
sum(case when month(b.时间)=1 then 数量 else 0 end) as [1月],
sum(case when month(b.时间)=2 then 数量 else 0 end) as [2月],
....
sum(case when month(b.时间)=12 then 数量 else 0 end) as [12月],
sum(数量) as [合计]
from a join b on a.产品编号=b.产品编号
group by a.产品名称,month(b.时间)
union all
select '[合计]', as 产品名称,
sum(case when month(b.时间)=1 then 数量 else 0 end) as [1月],
sum(case when month(b.时间)=2 then 数量 else 0 end) as [2月],
....
sum(case when month(b.时间)=12 then 数量 else 0 end) as [12月],
sum(数量) as [合计]
from a join b on a.产品编号=b.产品编号
group by month(b.时间)
playyuer 2004-01-07
  • 打赏
  • 举报
回复
to DigJim(挖土) :
请考虑跨年!
playyuer 2004-01-07
  • 打赏
  • 举报
回复
请参考:
http://expert.csdn.net/Expert/topic/2629/2629006.xml?temp=.2656366
DigJim 2004-01-07
  • 打赏
  • 举报
回复
SELECT a.产品名称,
SUM(CASE MONTH(b.时间) WHEN 1 THEN b.数量 ELSE 0 END) AS 1月,
SUM(CASE MONTH(b.时间) WHEN 2 THEN b.数量 ELSE 0 END) AS 2月,
SUM(CASE MONTH(b.时间) WHEN 3 THEN b.数量 ELSE 0 END) AS 3月,
SUM(CASE MONTH(b.时间) WHEN 4 THEN b.数量 ELSE 0 END) AS 4月,
SUM(CASE MONTH(b.时间) WHEN 5 THEN b.数量 ELSE 0 END) AS 5月,
SUM(CASE MONTH(b.时间) WHEN 6 THEN b.数量 ELSE 0 END) AS 6月,
SUM(CASE MONTH(b.时间) WHEN 7 THEN b.数量 ELSE 0 END) AS 7月,
SUM(CASE MONTH(b.时间) WHEN 8 THEN b.数量 ELSE 0 END) AS 8月,
SUM(CASE MONTH(b.时间) WHEN 9 THEN b.数量 ELSE 0 END) AS 9月,
SUM(CASE MONTH(b.时间) WHEN 10 THEN b.数量 ELSE 0 END) AS 10月,
SUM(CASE MONTH(b.时间) WHEN 11 THEN b.数量 ELSE 0 END) AS 11月,
SUM(CASE MONTH(b.时间) WHEN 12 THEN b.数量 ELSE 0 END) AS 12月,
SUM(b.数量) 合计
FROM b
join a on b.产品编号=a.产品编号
playyuer 2004-01-07
  • 打赏
  • 举报
回复
这道题其实不难!

但你还是应该考虑用在客户端用报表工具实现会更简单!

small_pig 2004-01-07
  • 打赏
  • 举报
回复
报表内容
[产品名称 时间] [1月] [2月] [3月] [4月] [...] [合计]
a01
a02
a03
[合计]。。。

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧