• 全部
  • 基础类
  • 应用实例
  • 新技术前沿

SQL的初学者求个问题解答,请诸位前辈朋友帮帮忙,谢谢!

Sammo 2009-10-17 02:07:21
想求一个最简短的储存过程编写方式,是在SQL2005下的,谢谢!

Total表的字段和数据(销售人,金额,日期)

张三,55.00,2009-7-1
张三,85.00,2009-7-2

张三,65.00,2009-8-2
张三,35.00,2009-8-4

李四,35.00,2009-9-7
李四,85.00,2009-9-19

李四,75.00,2009-10-8
李四,55.00,2009-10-12

Offer表的字段和数据(销售人,金额,日期)

张三,50.00,2009-9-7
张三,60.00,2009-9-9

张三,70.00,2009-10-8
张三,80.00,2009-10-9

李四,60.00,2009-7-7
李四,40.00,2009-7-9

李四,50.00,2009-8-8
李四,50.00,2009-8-9

根据Total和Offer两个表统计生成以下表格

显示结果:
销售人 Total.金额 Offer.金额 月份
张三 0.00 0.00 1
张三 0.00 0.00 2
张三 0.00 0.00 3
张三 0.00 0.00 4
张三 0.00 0.00 5
张三 0.00 0.00 6
张三 140.00 0.00 7
张三 100.00 0.00 8
张三 0.00 110.00 9
张三 0.00 150.00 10
张三 0.00 0.00 11
张三 0.00 0.00 12
李四 0.00 0.00 1
李四 0.00 0.00 2
李四 0.00 0.00 3
李四 0.00 0.00 4
李四 0.00 0.00 5
李四 0.00 0.00 6
李四 0.00 100.00 7
李四 0.00 100.00 8
李四 120.00 0.00 9
李四 130.00 0.00 10
李四 0.00 0.00 11
李四 0.00 0.00 12
...全文
75 点赞 收藏 12
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
gsk09 2009-10-17
[Quote=引用 10 楼 sammo 的回复:]
SQL codeselect[金额],0,[金额],month([月份])from Offerwhereyear([月份])=@year
这句是什么意思呢?为什么有两个[金额]呀?
[/Quote]

不好意思,当时太着急,写错了。
那句里面的第一个[金额]应该是[销售人]。
回复
Sammo 2009-10-17
可以了,谢谢!
回复
Sammo 2009-10-17

select [金额],0,[金额],month([月份]) from Offer where year([月份]) = @year

这句是什么意思呢?为什么有两个[金额]呀?
回复
Sammo 2009-10-17
[Quote=引用 8 楼 gsk09 的回复:]
SQL codecreateprocedure CalMoney@yearsmallintasset nocounton
;with aas
(select nm,sum(tMoney) tMoney,sum(oMoney) oMoney,mfrom
(select[销售人] nm,[金额] tMoney,0 oMoney,month([月份]) mfrom Totalwhereyear(¡­
[/Quote]
谢谢gsk09的关注,谢谢朋友们的关注,gsk09的办法看起来接近我要做的,,我试了一下,但老出现这个错误:“消息 241,级别 16,状态 1,过程 CallMoney,第 5 行 从字符串向 datetime 转换时失败。”
,我怎么改都不行。
回复
gsk09 2009-10-17

create procedure CalMoney
@year smallint
as
set nocount on
;with a as
(
select nm,sum(tMoney) tMoney,sum(oMoney) oMoney,m
from
(
select [销售人] nm,[金额] tMoney,0 oMoney,month([月份]) m from Total where year([月份]) = @year
union all
select [金额],0,[金额],month([月份]) from Offer where year([月份]) = @year
)t
group by nm, m
)
select
n.nm [销售人]
,isnull(a.tMoney,0) [Total.金额]
,isnull(a.oMoney,0) [Offer.金额]
,sp.number [月份]
from (select distinct a.nm from a ) n
inner join master..spt_values sp
on sp.type = 'P'
and sp.number >=1
and sp.number <= 12
left join a
on n.nm = a.nm
and sp.number = a.m
set nocount off
回复
gsk09 2009-10-17

create procedure CalMoney
@year smallint
as
set nocount on
;with a as
(
select nm,sum(tMoney) tMoney,sum(oMoney) oMoney,m
from
(
select [人] nm,[金] tMoney,0 oMoney,month(日期) m from Total where year(日期) = @year
union all
select 人,0,金,month(日期) from Offer where year(日期) = @year
)t
group by nm, m
)
select
n.nm
,isnull(a.tMoney,0) tMoney
,isnull(a.oMoney,0) oMoney
,sp.number
from (select distinct a.nm from a ) n
inner join master..spt_values sp
on sp.type = 'P'
and sp.number >=1
and sp.number <= 12
left join a
on n.nm = a.nm
and sp.number = a.m
set nocount off


调用

CalMoney 2009
回复
--小F-- 2009-10-17
好象有点问题 楼主自己修改下
回复
bancxc 2009-10-17
造月份

select number from master..spt_values where type='p' and Number between 1 and 12


回复
--小F-- 2009-10-17
select * from 
(select 销售人,sum(金额) as 金额 from [Total] group by 销售人 )a
full join
(select 销售人,sum(金额) as 金额,month(日期) as 日期 from [Total] group by 销售人,month(日期) )b
on
a.销售人=b.销售人
full join
(select number from master.dbo.spt_values where type = 'p' and number between 1 and 12)c
on
b.日期=c.number
order by
c.number
回复
Sammo 2009-10-17
[Quote=引用 2 楼 navy887 的回复:]
SQL codeselect 销售人,sum(t.金额) Total.金额,sum(o.金额) Offer.金额,month(t.日期)from totalas t,Offeras owhere t.销售人=o.销售人groupby t.销售人,month(t.日期)orderby t.销售人,month(t.日期)
[/Quote]

谢谢navy887的关注!这样好像不行哦?而且也没有考虑把1到12月,其中有某月份没有销售额时,显示为0.
回复
navy887 2009-10-17
select 销售人,sum(t.金额) Total.金额,sum(o.金额) Offer.金额,month(t.日期)
from total as t,Offer as o
where t.销售人=o.销售人
group by t.销售人,month(t.日期)
order by t.销售人,month(t.日期)
回复
--小F-- 2009-10-17
先构造一个月份表 然后left join
回复
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2009-10-17 02:07
社区公告
暂无公告