请SQL高手帮忙!!(100分)

  • 主题发起人 主题发起人 xueminliu
  • 开始时间 开始时间
X

xueminliu

Unregistered / Unconfirmed
GUEST, unregistred user!
现有一个MSSQL数据库,里面有表如下:
fpbh char(8), --发票编号
sgsj datetime, --收购时间
jhrxm char(8), --交货人姓名
dj char(2) NULL, --等级 取值为1、2、3
zl decimal(9, 2) DEFAULT 0 --重量
用户要求做如下统计
jhrxm 当日交货总量 当日一级重量 当日二级重量 当日三级重量 本月交货总量 一级 二级 三级 交货总量 一级 二级 三级

即要求按照交货人对zl进行统计,统计要求是分别按照日、月、和总计,每一个统计里面又要求
按照等级分类统计,类型分别是1、2、3三类等级
小弟现在用临时表一个一个填写,但是为了不被用户骂死只好向各位大哥求救,
如果可以搞定分有点是,甚至可以把我刚刚改造在2000下的屏幕取词源代码相送(VC-》Delphi移植)
该源代码根据微软公布的接口,很有趣哦!
 
这是交叉表查询,如果是Access还可以,MS SqlServer省省吧,查一历史问题你就知道这
类问题都没有好答案。
 
写一存储过程,建四个临时表,#jhr(jhrxm)

#day,#month,#total
内容可以从表名上看出,字段都为(jhrxm,total,one,two,three)
将相应数据添入,大概用十个 insert 语句

最后 :
select a.jhrxm,
b.total,b.one,b.two,b.three,
c.total,b.one,b.two,b.three,
d.total,b.one,b.two,b.three
from #jhr a,#day b,#month c,#total d
where a.jhrxm *= b.jhrxm and a.jhrxm *= c.jhrxm and a.jhrxm *= d.jhrxm
(或者*写在等号左边,试一下)

这方法如果有几千条记录,几秒钟就可以搞定.

还有什么可以再讨论!
 
最好是用存贮过程
 
9494,用存储过程最好。
 
我来试试:
select a.jhrxm 当日交货总量 当日一级重量 当日二级重量 当日三级重量 ... from (
select distinct jhrxm from t a
left join (select jhrxm,sum(zl) as 当日一级重量 where sgsj=GETDATE() and dj='1' group by jhrxm) b on a.jhrxm=b.jhrxm
left join (select jhrxm,sum(zl) as 当日二级重量 where sgsj=GETDATE() and dj='2' group by jhrxm) c on a.jhrxm=c.jhrxm
left join (select jhrxm,sum(zl) as 当日三级重量 where sgsj=GETDATE() and dj='3' group by jhrxm) d on a.jhrxm=d.jhrxm
left join (select jhrxm,sum(zl) as 当日总量 where sgsj=GETDATE() group by jhrxm) e on a.jhrxm=e.jhrxm

left join (select jhrxm,sum(zl) as 当月一级重量 where Year(sgsj)=Year(GETDATE()) and Month(sgsj)=Month(GETDATE()) and dj='1' group by jhrxm) f on a.jhrxm=f.jhrxm
left join (select jhrxm,sum(zl) as 当月二级重量 where Year(sgsj)=Year(GETDATE()) and Month(sgsj)=Month(GETDATE()) and dj='2' group by jhrxm) g on a.jhrxm=g.jhrxm
left join (select jhrxm,sum(zl) as 当月三级重量 where Year(sgsj)=Year(GETDATE()) and Month(sgsj)=Month(GETDATE()) and dj='3' group by jhrxm) h on a.jhrxm=h.jhrxm
left join (select jhrxm,sum(zl) as 当月总量 where Year(sgsj)=Year(GETDATE()) and Month(sgsj)=Month(GETDATE()) group by jhrxm) i on a.jhrxm=i.jhrxm

left join (select jhrxm,sum(zl) as 一级总量 where dj='1' group by jhrxm) j on a.jhrxm=j.jhrxm
left join (select jhrxm,sum(zl) as 二级总量 where group by jhrxm) k on a.jhrxm=k.jhrxm
left join (select jhrxm,sum(zl) as 三级总量 where group by jhrxm) l on a.jhrxm=l.jhrxm
left join (select jhrxm,sum(zl) as 总量 where group by jhrxm) m on a.jhrxm=m.jhrxm
)

你试试,细节上可能是有问题的,你再调试一下。
 
各位大哥。小弟数据库是菜鸟,只会简单的select和insert。没有写过存储过程。
不知哪位大哥能帮我写一个demo,就以上面的要求,因为我的报表很多象这样子的要求。
我就可以参考写其他的存储过程。

如果各位对屏幕取词感兴趣留下Email,我可以mail给你们。当然是在存储过程搞定的
前提下。

表的结构如上所示,参数只有一个,就是时间(时间不一定是当天,由用户选择,当作参数
传递进去)

拜托了
 
用二级视图,一级视图处理每一子项目,再用二级视图将一级视图连接生成最终结果.
日期在视图只是多个收购时间字段,最后生成报表时再动态处理,
这样可能统计一小部分信息略慢, 但却是通用解决办法, 编程者省事,也好维护.
 
xueminliu, 你好:
此类问题属于阶段性统计问题,好的解决方法只有一个(我的看法):在数据库中建立一个
《期末余额表》,期的概念可以是月,如果交货表数据量很大,期可以设为日。数据库的字段

jhrxm,pyear,pmonth,本月一级重量,本月二级重量,本月三级重量,本月交货总量,年交货总量,年一级,年二级,年三级

jhrxm,pyear,pmonth,pday,本日一级重量,本日二级重量,本日三级重量,本日交货总量,月交货总量,月一级,月二级,月三级,年交货总量,年一级,年二级,年三级
。然后写交货表的触发器(insert,update,delete),这个你应该知道怎么写。至于在程序中的sql我也不说了。
另外,数据库中的关于年的字段也可不要,如果有编程方便。
你还应该有一个初始化《期末余额表》的存储过程或程序。
 
谢谢各位大哥,小弟先试试,非常感谢各位
 
可以仿照这样来写存储过程

CREATE proc temp_1
@begintime datetime
as
---建立数据检索表
create table #temp_jhr
(fpbh char, --发票编号
sgsj datetime, --时间
jhrxm char, --交货人姓名
dj char, --等级
zl float ——重量
)
--插入数据
insert into #temp_jhr
(fpbh,
sgsj ,
jhrxm,
dj,
zl
)

select fpbh,sgsj,jhrxm,dj,zl
from datatable
……
 
create procedure Sum_Zl @Dt DateTime as
select a.jhrxm 当日交货总量 当日一级重量 当日二级重量 当日三级重量 ... from (
select distinct jhrxm from t a
left join (select jhrxm,sum(zl) as 当日一级重量 where sgsj=@Dt and dj='1' group by jhrxm) b on a.jhrxm=b.jhrxm
left join (select jhrxm,sum(zl) as 当日二级重量 where sgsj=@Dt and dj='2' group by jhrxm) c on a.jhrxm=c.jhrxm
left join (select jhrxm,sum(zl) as 当日三级重量 where sgsj=@Dt and dj='3' group by jhrxm) d on a.jhrxm=d.jhrxm
left join (select jhrxm,sum(zl) as 当日总量 where sgsj=@Dt group by jhrxm) e on a.jhrxm=e.jhrxm
left join (select jhrxm,sum(zl) as 当月一级重量 where Year(sgsj)=Year(@Dt) and Month(sgsj)=Month(@Dt) and dj='1' group by jhrxm) f on a.jhrxm=f.jhrxm
left join (select jhrxm,sum(zl) as 当月二级重量 where Year(sgsj)=Year(@Dt) and Month(sgsj)=Month(@Dt) and dj='2' group by jhrxm) g on a.jhrxm=g.jhrxm
left join (select jhrxm,sum(zl) as 当月三级重量 where Year(sgsj)=Year(@Dt) and Month(sgsj)=Month(@Dt) and dj='3' group by jhrxm) h on a.jhrxm=h.jhrxm
left join (select jhrxm,sum(zl) as 当月总量 where Year(sgsj)=Year(@Dt) and Month(sgsj)=Month(@Dt) group by jhrxm) i on a.jhrxm=i.jhrxm
left join (select jhrxm,sum(zl) as 一级总量 where dj='1' group by jhrxm) j on a.jhrxm=j.jhrxm
left join (select jhrxm,sum(zl) as 二级总量 where group by jhrxm) k on a.jhrxm=k.jhrxm
left join (select jhrxm,sum(zl) as 三级总量 where group by jhrxm) l on a.jhrxm=l.jhrxm
left join (select jhrxm,sum(zl) as 总量 where group by jhrxm) m on a.jhrxm=m.jhrxm
)
 
按aimin的说法去做。
可加上日缓冲表。
 
jhrxm 当日交货总量 当日一级重量 当日二级重量 当日三级重量
jhrxm 本月交货总量 一级 二级 三级
jhrxm 货总量 一级 二级 三级
分成三组 分别建立三个视图,在每个视图中都有jhrxm 用关联进行连接。
但是还是同意楼上的老兄的意见!
 
谢谢各位大哥,建议都不错,我基本上试过了,还行。长了不少见识
 
to xueminliu:你的邮箱有问题,我发出的信老被退回
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部