->>200分求sql统计语句....跟贴有分.

newcar 2005-08-24 11:11:25
有3个表,分别如下...
表1:tminfo (工种消耗劳动保护用品信息表)
字段:tgzid(工种),fbm(老保用品编码),fqx(消耗月数),fsl(消耗数量)
表2:tprock (部门领用出库情况表)
字段:fbm,fdept(部门),flyrq(领用日期),fsl(领用数量)
表3:tstaff (员工基本信息表)
字段:fxm(姓名),fdept(所在部门),fgz(工种,和表tminfo.fgzid一样)
不难看出是一个老保用品管理的数据
问题1:想知道1个部门领用某一种fbm(老保用品)一次应该领多少,要明细,包括部门每个人都需要领多少..
问题2:根据部门上次领用出库时间和老保用品的消耗时间等,算出到未来某个月该部门还需要领用某种fbm的东西是多少和具体明细.(部门领用某一种物品时必须要把该部门所需的物品一次性全部领走)
问题有些复杂,希望各位大虾帮帮小弟...及及及呀...................
...全文
335 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
newcar 2005-08-31
  • 打赏
  • 举报
回复
部门领用一种东西的时候...把截至到当前时间应该领用的东西全部领走..如果不是全部领走的话就出问题了.....哈哈....问题自己已经解决了.......看着自己写的sql语句自己都头痛......
CREATE PROCEDURE [get_pro]
@bm varchar(20), --物品编码
@dept varchar(50), --部门id
@rq datetime, --领用时间
@xm varchar(20), ---姓名
@flag int --分类标识
AS
--declare @dept_str varchar(50)
--set @dept_str='%'+@dept+'%'

if (@flag=1 ) --按部门分类汇总
begin
SELECT *, DATEDIFF(month, cc.FLYRQ, @rq) AS fmonth, DATEDIFF(month, cc.FLYRQ, @rq) / cc.FQX * cc.FSL AS fxlsl
FROM (SELECT AA.FDEPT, AA.FQX, SUM(AA.FSL) AS FSL, bb.FLYRQ
FROM (SELECT dbo.TMINFO.FGZID AS Expr1, dbo.TStaff.*, dbo.TMINFO.FBM AS FBM, dbo.TMINFO.FQX AS FQX,
dbo.TMINFO.FSL AS FSL, dbo.TStaff.FDEPT AS FDEPT1
FROM dbo.TStaff INNER JOIN
dbo.TMINFO ON dbo.TStaff.FGZ = dbo.TMINFO.FGZID
WHERE (dbo.TMINFO.FBM like @bm)) AA INNER JOIN
(SELECT FDEPT, MAX(FLYRQ) AS FLYRQ
FROM dbo.TPROCK
GROUP BY FDEPT) bb ON AA.FDEPT = bb.FDEPT
GROUP BY AA.FDEPT, AA.FQX, bb.FLYRQ) cc INNER JOIN
dbo.Tdept ON cc.FDEPT = dbo.Tdept.index_id
WHERE (DATEDIFF(month, cc.FLYRQ, @rq) > 0)
end
if (@flag=2) --按部门,.编码分类汇总
begin
SELECT dd.FDEPT, dd.fbm, dd.FLYRQ, SUM(dd.flysl) AS fxlsl, dbo.Tdept.field_name,
dbo.Thuohao.MC, dbo.Thuohao.guige, dbo.Thuohao.jiliang
FROM (SELECT *, FLYRQ AS Expr2, DATEDIFF([month], FLYRQ, @RQ) AS fmonth,
DATEDIFF([month], FLYRQ, @RQ) / FQX * FSL AS flysl
FROM (SELECT AA.FDEPT, aa.fbm, AA.FQX, SUM(AA.FSL) AS FSL, bb.FLYRQ
FROM (SELECT dbo.TMINFO.FGZID AS Expr1, dbo.TStaff.*,
dbo.TMINFO.FBM AS FBM, dbo.TMINFO.FQX AS FQX,
dbo.TMINFO.FSL AS FSL, dbo.TStaff.FDEPT AS FDEPT1
FROM dbo.TStaff INNER JOIN
dbo.TMINFO ON dbo.TStaff.FGZ = dbo.TMINFO.FGZID)
AA INNER JOIN
(SELECT FDEPT, MAX(FLYRQ) AS FLYRQ
FROM dbo.TPROCK
GROUP BY FDEPT) bb ON AA.FDEPT = bb.FDEPT
GROUP BY AA.FDEPT, aa.fbm, AA.FQX, bb.FLYRQ) cc) dd INNER JOIN
dbo.Tdept ON
dd.FDEPT COLLATE Chinese_PRC_CI_AS = dbo.Tdept.index_id INNER JOIN
dbo.Thuohao ON dd.fbm COLLATE Chinese_PRC_CI_AS = dbo.Thuohao.BM
WHERE (dd.FDEPT LIKE @DEPT) AND (dd.fbm LIKE @BM)
GROUP BY dd.FDEPT, dd.fbm, dd.FLYRQ, dbo.Tdept.field_name, dbo.Thuohao.MC,
dbo.Thuohao.guige, dbo.Thuohao.jiliang
HAVING (SUM(dd.flysl) > 0)

end
if (@flag=3) --按部门,编码,姓名分类汇总-
begin
SELECT dd.FDEPT, dd.fxm, dd.fbm, dd.FLYRQ, SUM(dd.flysl) AS fxlsl, dbo.Thuohao.MC,
dbo.Tdept.field_name, dbo.Thuohao.guige, dbo.Thuohao.jiliang
FROM (SELECT *, FLYRQ AS Expr2, DATEDIFF([month], FLYRQ, @RQ) AS fmonth,
DATEDIFF([month], FLYRQ, @RQ) / FQX * FSL AS flysl
FROM (SELECT AA.FDEPT, aa.fxm, aa.fbm, AA.FQX, SUM(AA.FSL)
AS FSL, bb.FLYRQ
FROM (SELECT dbo.TMINFO.FGZID AS Expr1, dbo.TStaff.*,
dbo.TMINFO.FBM AS FBM, dbo.TMINFO.FQX AS FQX,
dbo.TMINFO.FSL AS FSL, dbo.TStaff.FDEPT AS FDEPT1
FROM dbo.TStaff INNER JOIN
dbo.TMINFO ON dbo.TStaff.FGZ = dbo.TMINFO.FGZID)
AA INNER JOIN
(SELECT FDEPT, MAX(FLYRQ) AS FLYRQ
FROM dbo.TPROCK
GROUP BY FDEPT) bb ON AA.FDEPT = bb.FDEPT
GROUP BY AA.FDEPT, aa.fxm, aa.fbm, AA.FQX, bb.FLYRQ) cc
WHERE fdept LIKE @DEPT AND fxm LIKE @XM AND fbm LIKE @BM) dd INNER JOIN
dbo.Thuohao ON
dd.fbm COLLATE Chinese_PRC_CI_AS = dbo.Thuohao.BM INNER JOIN
dbo.Tdept ON dd.FDEPT COLLATE Chinese_PRC_CI_AS = dbo.Tdept.index_id
GROUP BY dd.FDEPT, dd.fxm, dd.fbm, dd.FLYRQ, dbo.Thuohao.MC, dbo.Tdept.field_name,
dbo.Thuohao.guige, dbo.Thuohao.jiliang
HAVING (SUM(dd.flysl) > 0)
end
GO
longfeih 2005-08-25
  • 打赏
  • 举报
回复
学习!
mm1122334 2005-08-25
  • 打赏
  • 举报
回复
顶一下!
mandyfan 2005-08-25
  • 打赏
  • 举报
回复
这个问题产生的原因是你的“部门领用出库情况表”中缺少工种字段。当然如果加入了这个字段,实际操作中又是不太好处理的(不可能录单子的时候还问一下部门是给哪些工种领的,然后分开录单子)。
mandyfan 2005-08-25
  • 打赏
  • 举报
回复
针对第二个问题的疑问:
如果一个部门的多个不同工种对于同一个商品都要领用,且消耗时间不同,部门在领用的时候怎么领?(还得遵循“部门领用某一种物品时必须要把该部门所需的物品一次性全部领走”)。第一次还可以一起领,以后呢?
假设实际工作中是可以处理此情况的。那么当过了一段时间后,部门对于该商品的最近一次领用就不知是给哪几个工种领的了,这样就需要从第一次领用开始获取数据,以知道到现在为止共领了多少,然后根据时间算出各个工种应该领多少,这样才能知道还须领多少。
那么又引出一个问题:如果系统从这个工作开始就使用,那么可以得到这些数据;如果系统是中途使用,那么你怎么解决呢?
yk766247 2005-08-25
  • 打赏
  • 举报
回复
不太懂
  • 打赏
  • 举报
回复
上面那位仁的方法不錯,可以一試
zsjzwj(北极熊)
個人認為,你最好把表建成遵循第三范式,這對你以后的工作大有幫助,比如讀臟數據,數據丟失,沖突等不好現狀況的發生。
newcar 2005-08-25
  • 打赏
  • 举报
回复
问题2主要复杂点:相同的工种相同编码的东西消耗时间可能不一样;相同工种消耗相同编码东西消耗数量可能不一样...相同东西不同部门上次领用时间不一样.....
syfly739 2005-08-25
  • 打赏
  • 举报
回复
up.......
newcar 2005-08-25
  • 打赏
  • 举报
回复
郁闷呀...
shou440 2005-08-25
  • 打赏
  • 举报
回复
学习!
huan9x 2005-08-25
  • 打赏
  • 举报
回复
up jf 学习
wtg476 2005-08-25
  • 打赏
  • 举报
回复
up..学习
wanlinshan 2005-08-25
  • 打赏
  • 举报
回复
学过点SQL不过看到你这个问题头疼。看看各位高手的解答,学习学习,帮你顶下。
hqhhh 2005-08-24
  • 打赏
  • 举报
回复
请问楼主:
------------
表1:tminfo (工种消耗劳动保护用品信息表)
字段:tgzid(工种),fbm(老保用品编码),fqx(消耗月数),fsl(消耗数量)
------------
1.这里的fqx(消耗月数)是什么类型,起到什么作用!
2.每位员工应该消耗多少,在哪里定义的?
hc0007 2005-08-24
  • 打赏
  • 举报
回复
up jf

zsjzwj 2005-08-24
  • 打赏
  • 举报
回复
问题1解决了

问题2数据不全
g961681 2005-08-24
  • 打赏
  • 举报
回复
``
zsjzwj 2005-08-24
  • 打赏
  • 举报
回复
(select A.tgzid,B.fxm,A.tgzid,A.fbm,fsl from tminfo A join tstaff B on A.tgzid=B.fgz group by B.tstaff,A.tgzid) A //这里得到部门和人的消耗量明细

zsjzwj 2005-08-24
  • 打赏
  • 举报
回复
麻烦呀,你慢慢分析,把要的信息先区分出来组成查询,然后再组合这些查询就可以了
加载更多回复(15)

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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