问题:如何用SQL语句对仓库数据汇总 ( 积分:50, 回复:26, 阅读:143 )
分类:数据库 - C/S型 ( 版主:千中元, kucio )
来自:misai, 时间:2001-9-12 15:50:00, ID:621951 [显示:小字体 | 大字体]
在下现有三个表,结构分别如下:
期初表: 编号 材料名称 期初库存
0001 电话机 8
0002 灯开关 5
收料表: 编号 材料名称 本期收料
0001 电话机 10
0003 电烙铁 15
发料表: 编号 材料名称 本期发料
0002 灯开关 3
想用SQL语句结出当前库存,显示成如下格式:
编号 名称 期初库存 本期收料 本期发料 当前库存
0001 电话机 8 10 18
0002 灯开关 5 3 2
0003 电烙铁 15 15
上述问题最好不用临时表,
本人所用工具为:delphi5.0+ado+sql server 2000
来自:misai, 时间:2001-9-12 15:58:00, ID:621976
上述问题SQL语句如何写,高手快来啊!
来自:sherman, 时间:2001-9-12 16:08:00, ID:622002
你应该使用full outer join,请查询sql2000的t-sql帮助
来自:misai, 时间:2001-9-12 16:18:00, ID:622032
to sherman:
我已经试过full outer join,可查询不出我要的结果,
请你亲自试试,此问题没那么简单
来自:misai, 时间:2001-9-12 16:35:00, ID:622067
大家帮帮我,分不够再加
来自:jianping0, 时间:2001-9-12 16:36:00, ID:622069
试一试这个:
select a.编号, a.材料名称,a.期初库存,b.本期收料, c.本期发料,a.期初库存+b.本期收料-c.本期发料
from 期初表 a,收料表 b,发料表 c
where (a outer join b on a.编号=b.编号) outer join c on a.编号=c.编号
来自:misai, 时间:2001-9-12 16:59:00, ID:622159
to jianping0:
你的答案我试过,有语法错误,请再想想办法
来自:misai, 时间:2001-9-12 17:17:00, ID:622208
请大家都来想办法,这是一个考验SQL能力的问题
来自:jianping0, 时间:2001-9-12 17:34:00, ID:622271
刚才没写好,是错了. 看看这个.
select m.编号, m.材料名称,m.期初库存,m.本期收料, c.本期发料,m.期初库存+m.本期收料-c.本期发料
from (select a.编号, a.材料名称,a.期初库存,b.本期收料
from 期初表 a outer join 收料表 b on a.编号=c.编号) m outer join 发料表 c on m.编号=c.编号
来自:sisha, 时间:2001-9-12 17:36:00, ID:622276
select a.编号, a.材料名称,a.期初库存,b.本期收料, c.本期发料,a.期初库存+b.本期收料-c.本期发料
from 期初表 a
join 收料表 b on a.编号=b.编号
join 发料表 c on a.编号=c.编号
不过用join,left join。。你就自己去试试,我也不记得啦。
来自:misai, 时间:2001-9-12 17:56:00, ID:622323
to jianping0:
还是有语法错误,这个语句比较长,请你最把调试过的源码贴上来,要不总有问题,
我弄了好长时间都不行。
来自:dlnew, 时间:2001-9-12 18:13:00, ID:622360
select a.编号, a.材料名称,a.期初库存,b.本期收料, c.本期发料,a.期初库存+b.本期收料-c.本期发料 as 当前库存
from 期初表 a
left join 收料表 b on a.编号=b.编号
left join 发料表 c on a.编号=c.编号
来自:misai, 时间:2001-9-13 7:32:00, ID:622971
to dlnew:
你的答案我试过,但结果出来只有0001,0002两条,0003没出来,把其中的left join改为
right join或full join 都不能出来预期的结果,看来这问题真的把大家难住啦?
请大家都来讨论!!!快来啊.
来自:misai, 时间:2001-9-13 7:51:00, ID:622975
高手都到哪里去啦,版主请帮帮忙吧
来自:Brave, 时间:2001-9-13 9:00:00, ID:623067
高手来了
这样写效率高,而且清楚:
select 编号,材料名称,sum(期初库存) 期初库存,sum(本期收料) 本期收料,sum(本期发料) 本期发料,
sum(期初库存+本期进料-本期发料) 期末结存 from
(
select 编号,材料名称,期初库存,0 本期收料,0 本期发料 from 期初表
union all
select 编号,材料名称,0 期初库存,本期收料,0 本期发料 from 收料表
union all
select 编号,材料名称,0 期初库存,0 本期收料,本期发料 from 发料表
) as a group by 编号,材料名称
顺便说一下,你的数据库设计好像违反了某一个范式,嘿嘿
来自:aspire, 时间:2001-9-13 9:45:00, ID:623185
如下语句可行,给分吧!,表A即期初表 ;A1为收料表; A2为发料表。NO--->编号;NAME-->
材料名称,openqty--->期初库存,inqty-->本期收料, outqty-->本期发料
select m.no, m.name,m.openqty,m.inqty, c.outqty,m.openqty+(case when m.inqty is null then
0 else
m.inqty end)-
(case when c.outqty is null then
0 else
c.outqty end)
from (select a.no, a.name,a.openqty,b.inqty
from a a left join a1 b on a.no=b.no
union select b.no,b.name,0,b.inqty
from a1 b where b.no not in (select no from a)) m left join a2 c on m.no=c.no
order by m.no
来自:rope, 时间:2001-9-13 10:24:00, ID:623286
Brave说的对,你的期初表设计的有问题,不管有没有期初值,
所有项目都应该在期初表里有一条记录。
如果是新加的,应该在期初表里面补一条记录。
另外,还是用临时表效率高,作程序要考虑到效率问题。
来自:misai, 时间:2001-9-13 10:33:00, ID:623306
to Brave:
你的答案我试了一下,提示:
'期初库存) 期初库存,sum(本期收料) 本期收料'等没有聚合函数或没加到GROUP BY
字句中,将上述一一加到GROUP BY后,可结出来的结果是明细,数量没有汇总,结果如下:
编号 名称 期初库存 本期收料 本期发料 当前库存
0001 电话机 0 10 0 10
0001 电话机 8 0 0 8
0002 灯开关 0 0 3 -3
0002 灯开关 5 0 0 5
0003 电烙铁 0 15 0 15
请再想想,好事做到底。
你说我的数据库设计违反了某一个范式,我数据库比较菜,请听听高论。
来自:Brave, 时间:2001-9-13 11:01:00, ID:623379
不可能,把你的SQL贴出来看一看!
group by 后面不能加那么多,只需要编号和名称就够了
来自:misai, 时间:2001-9-13 11:02:00, ID:623383
to rope:
想请教一下临时表的问题:
假设有一个临时表,表名为LS,存打印临时数据,
若用户A正选择打印姓 '王' 的人,则LS里生成的是 姓 '王' 的人,
若用户B想选择打印姓 '李' 的人,则LS里生成的是 姓 '李' 的人,
可用户A还没打完,这种情况该怎么办?
来自:misai, 时间:2001-9-13 11:15:00, ID:623405
to Brave:
SELECT 编号, 材料名称 , 期初库存 ,本期收料 ,本期发料 ,当前库存
FROM (SELECT 编号,材料名称, 期初库存, 0 本期收料, 0 本期发料
FROM 期初表
UNION ALL
SELECT 编号, 材料名称, 0 期初库存, 本期收料, 0 本期发料
FROM 收料表
UNION ALL
SELECT 编号, 材料名称, 0 期初库存, 0 本期收料, 本期发料
FROM 发料表) A
GROUP BY 编号, 材料名称 ,期初库存
ORDER BY 编号
来自:Brave, 时间:2001-9-13 11:19:00, ID:623418
错,本着负责的原则我实际做了一遍。(实际建了3个表,插入数据,然后执行,后面是结果)
为了你这点分,我容易吗?
字段采用的是拼音缩写。
select bh,mc,sum(qckc) qckc,sum(bqsl) bqsl,sum(bqfl) bqfl,sum(qckc+bqsl-bqfl) dqkc from
(
select bh,mc,qckc,0 bqsl,0 bqfl from qcb
union all
select bh,mc,0 qckc,bqsl,0 bqfl from slb
union all
select bh,mc,0 qckc,0 bqsl,bqfl from flb
) as a group by bh,mc order by bh
bh mc qckc bqsl bqfl dqkc
---------- ------------------------------ ----------------------------------------------------- ----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
0001 电话机 8.0 10.0 0.0 18.0
0002 灯开关 5.0 0.0 3.0 2.0
0003 电烙铁 0.0 15.0 0.0 15.0
(3 row(s) affected)
来自:rope, 时间:2001-9-13 11:29:00, ID:623445
临时表只对生成临时表的那个连接(session)可见,
不要说是两个不同的用户,就是同一个用户把同样的
程序同时运行两次,程序生成的临时表都是不一样的,
呵呵。
来自:rope, 时间:2001-9-13 11:31:00, ID:623459
to misai
补充,你的那个LS不是临时表的概念,呵呵