◆求一综合性很强的SQL语句
数据库有以下字段:
入库表:(vdate入库日期,nb为物料编号,name为物料名称,amount为入库数量)
vdate nb name amount
2005-04-01 001 原珠笔 1000
2005-05-01 002 水性笔 3000
2005-05-01 001 原珠笔 2000
出库表:(odate出库日期,nb为物料编号,name为物料名称,amount出库数量)
odate nb name amount
2005-04-01 001 原珠笔 100
2005-05-01 002 水性笔 100
2005-05-02 001 原珠笔 200
现在想求出2005年5月1日至2005年5月30日的库存表:
(综合性很强的罗!)详细如下:
注:
上次库存是(2005年5月1日以前的入库数量)-(2005年5月1日以前的出库数量)
本月入库是(2005年5月1日至2005年5月30日的入库数量)
本月出库是(2005年5月1日至2005年5月30日的出库数量)
还剩库存是(上次库存+本月入库-本月出库)
物料编号 物料名称 上次库存 本月入库 本月出库 还剩库存
001 原珠笔 900 2000 200 2700
002 水性笔 0 3000 100 2900
帮忙一下,谢谢。。。
问题点数:50、回复次数:46Top
1 楼icedut(冰-装修进行中)回复于 2005-06-02 15:14:22 得分 35
可以考虑增加一个库存表,用于存放上次的盘点库存
Top
2 楼cwm545(罪人)回复于 2005-06-02 15:18:38 得分 0
我觉得用SQL可以直接算出。。
那位,来一句。。谢谢!Top
3 楼icedut(冰-装修进行中)回复于 2005-06-02 15:30:18 得分 0
是可以指结算
如果数据量大
效率是要考虑的阿
楼主再不把建表信息,贴上来,我给你写语句
Top
4 楼cwm545(罪人)回复于 2005-06-02 15:33:44 得分 0
呵呵,谢谢楼上的。
我上面不是全贴了,基本已经很详细了。Top
5 楼icedut(冰-装修进行中)回复于 2005-06-02 15:33:58 得分 0
其实本月的进出,你应该很容易得到的
某个时间点的库存:之前的所有进货-出货
Top
6 楼icedut(冰-装修进行中)回复于 2005-06-02 15:38:28 得分 0
你是贴全了
我岂不是还要在sql server里面
create table...
insert into table...
这个很烦的阿Top
7 楼icedut(冰-装修进行中)回复于 2005-06-02 15:40:41 得分 0
其实本月的进出,你应该很容易得到的
某个时间点的库存:之前的所有进货-出货
你这么想,自己都能写出来的Top
8 楼cwm545(罪人)回复于 2005-06-02 15:52:35 得分 0
谢谢你连发三贴。
我就是对JOIN不熟啊。。
期待中!Top
9 楼vbman2003(家人)回复于 2005-06-02 15:54:45 得分 15
别的不说,这两张表完全可以合并为一张表,加一个标识入出库的字段就可了。或者干脆用正负数表示入出库数量,是不是比现在更有效率?
Top
10 楼icedut(冰-装修进行中)回复于 2005-06-02 15:56:32 得分 0
什么数据库阿
楼主难道不能把create table
insert into
贴出来么
Top
11 楼cwm545(罪人)回复于 2005-06-02 15:57:33 得分 0
家人,谢谢你。
这两张表的结枸不一致的。Top
12 楼icedut(冰-装修进行中)回复于 2005-06-02 16:00:00 得分 0
还应该加一个
产品编码表
原珠笔 --这种内容最好不要出现在进出库德表中Top
13 楼vbman2003(家人)回复于 2005-06-02 16:01:56 得分 0
没时间帮你写,你可以用笨方法,分别建三个视图:
上次库存(2005年5月1日以前的入库数量)-(2005年5月1日以前的出库数量)
本月入库(2005年5月1日至2005年5月30日的入库数量)
本月出库(2005年5月1日至2005年5月30日的出库数量)
然后,关联以上三个查询做一个汇总查询就可了。Top
14 楼cwm545(罪人)回复于 2005-06-02 16:04:27 得分 0
建视图,再查询。
晕,我都没试过。。Top
15 楼icedut(冰-装修进行中)回复于 2005-06-02 16:06:15 得分 0
楼主什么数据库阿
Top
16 楼vbman2003(家人)回复于 2005-06-02 16:08:02 得分 0
icedut(冰) 说的没错,你现在的表是多对多关系。我想这样实现起来简单一点Top
17 楼icedut(冰-装修进行中)回复于 2005-06-02 16:08:02 得分 0
和楼主说话真是累啊
我还是歇会吧Top
18 楼cwm545(罪人)回复于 2005-06-02 16:11:58 得分 0
谢谢两位。
SQL SERVER2000的
Top
19 楼icedut(冰-装修进行中)回复于 2005-06-02 16:12:42 得分 0
create table tmp_input(vdate datetime,nd varchar(20),name varchar(20),amount int )
create table tmp_output(vdate datetime,nd varchar(20),name varchar(20),amount int )
insert into tmp_input
select '2005-04-01','001','原珠笔',1000
union
select '2005-05-01','002','水性笔', 3000
union
select '2005-05-01','001','原珠笔', 2000
insert into tmp_output
select '2005-04-01','001','原珠笔',100
union
select '2005-05-01','002','水性笔',100
union
select '2005-05-02','001','原珠笔',200
--某一个时间点的库存
select nd,name,sum(case type when 'in' then amount else 0 end)-sum(case type when 'out' then amount else 0 end)
from
(
select nd,name,vdate,amount,'in' as Type from tmp_input
union
select nd,name,vdate,amount,'out' as type from tmp_output
)
a where vdate<='2005-05-30'
group by nd,nameTop
20 楼icedut(冰-装修进行中)回复于 2005-06-02 16:14:58 得分 0
和楼主说话太累
我就写着写了
剩下的你自己慢慢写吧Top
21 楼vbman2003(家人)回复于 2005-06-02 16:16:30 得分 0
你现在会有一个问题
就是一个产品本月入库表中有,出库表中没有,或者上个月有这个月没有,等等类似这样的情况
所以要象 icedut(冰) 所说的,要有一个产品表来解决这样的问题Top
22 楼cwm545(罪人)回复于 2005-06-02 16:18:27 得分 0
高手啊,这么快。
select nd,name,vdate,amount,'in' as Type from tmp_input
'in' as Type 是什么东东啊?Top
23 楼vbman2003(家人)回复于 2005-06-02 16:23:21 得分 0
通俗地说查询后多出一列别名为Type,内容是in,应该是表示入库的意思吧Top
24 楼icedut(冰-装修进行中)回复于 2005-06-02 16:24:05 得分 0
用in 表示入库
type 表示类型列
as type 相当于生成一个列名为type的列Top
25 楼icedut(冰-装修进行中)回复于 2005-06-02 16:26:13 得分 0
如果数据量大
最好加一个库存表
不然速度可是很慢的Top
26 楼cwm545(罪人)回复于 2005-06-02 16:39:19 得分 0
谢谢。
等下,我两张表的结构不一样,这样用UNION好像不行吧?Top
27 楼icedut(冰-装修进行中)回复于 2005-06-02 16:49:05 得分 0
谢谢。
等下,我两张表的结构不一样,这样用UNION好像不行吧?
--
我取得字段结构是一样的不就行了么Top
28 楼cwm545(罪人)回复于 2005-06-02 17:00:38 得分 0
好的,谢谢你们。
我等下测试一下,有什么情况再通知你们。
Top
29 楼cxbkkk(本命年,旺啊!)回复于 2005-06-02 23:21:59 得分 0
和我这几天帮人做的差不多,你应该还有一个库存表吧。这样就可以很容易操作了,而且这样打印入库,出库也很方便啊,我做库存管理建了4个表,出入,库存,用户,你要查库存就直接来比较就是了,或者通过filter来实现都可以,不需要那么麻烦的,而且效率提高Top
30 楼cwm545(罪人)回复于 2005-06-03 11:35:56 得分 0
--某一个时间点的库存
select nd,name,sum(case type when 'in' then amount else 0 end)-sum(case type when 'out' then amount else 0 end)
from
(
select nd,name,vdate,amount,'in' as Type from tmp_input
union
select nd,name,vdate,amount,'out' as type from tmp_output
)
a where vdate<='2005-05-30'
group by nd,name
不行啊,这只能仅仅是库存。。。
能不能一步到位就有:
物料编号 物料名称 上次库存 本月入库 本月出库 还剩库存
谢谢你。。Top
31 楼flyingscv(zlj)回复于 2005-06-03 12:45:47 得分 0
select a.物料编号 a.物料名称 a,上次库存 b.本月入库 b.本月出库 c.还剩库存 from
....
where a.物料编号 =b.物料编号 and a.物料编号 =c.物料编号Top
32 楼flyingscv(zlj)回复于 2005-06-03 12:46:07 得分 0
select a.物料编号 a.物料名称 a,上次库存 b.本月入库 b.本月出库 c.还剩库存 from
....
where a.物料编号 =b.物料编号 and a.物料编号 =c.物料编号Top
33 楼cwm545(罪人)回复于 2005-06-03 13:05:27 得分 0
我晕。。
这不行啊。Top
34 楼cwm545(罪人)回复于 2005-06-03 15:46:13 得分 0
惨啊,再搞不定,我5月份的库存就算不出了。。
那位能帮我一下。。
Top
35 楼icedut(冰-装修进行中)回复于 2005-06-03 16:03:23 得分 0
5月的库存你不是可以知道么
同样4月末的库存也可以知道阿
本月进出也不难啊
大家都觉得太烦了,而不愿意写啊Top
36 楼icedut(冰-装修进行中)回复于 2005-06-03 16:15:19 得分 0
select nd,name,sum(amount) as InQty
from tmp_input
where vdate>='2005-05-01' and vdate<='2005-05-31' --本月入
group by nd,name
select nd,name,sum(amount) as OutQty
from tmp_output
where vdate>='2005-05-01' and vdate<='2005-05-31' --本月出
group by nd,nameTop
37 楼cwm545(罪人)回复于 2005-06-03 16:16:06 得分 0
呵呵,你来了。
不行啊,我觉得如果能用SQL语句一步取出来,这是最好的。
不然太多事了。Top
38 楼icedut(冰-装修进行中)回复于 2005-06-03 16:19:24 得分 0
--没有上月库存,写得好麻烦啊,谁有好的给写写
select d.nd,d.name,d.Stock,e.inQty,f.outqty
from (
select nd,name,
sum(case type when 'in' then amount else 0 end)-sum(case type when 'out' then amount else 0 end) as Stock
from
(
select nd,name,vdate,amount,'in' as Type from tmp_input
union
select nd,name,vdate,amount,'out' as type from tmp_output
)
a where vdate<='2005-05-30'
group by nd,name
) d
left outer join
(
select nd,name,sum(amount) as InQty
from tmp_input
where vdate>='2005-05-01' and vdate<='2005-05-31'
group by nd,name
) e on d.nd=e.nd
left outer join
(
select nd,name,sum(amount) as OutQty
from tmp_output
where vdate>='2005-05-01' and vdate<='2005-05-31'
group by nd,name
)f on d.nd=f.ndTop
39 楼icedut(冰-装修进行中)回复于 2005-06-03 16:22:53 得分 0
楼主,这样的效率肯定很差
select d.nd,d.name,d.Stock,e.inQty,f.outqty,g.stock as PrevStock
from (
select nd,name,
sum(case type when 'in' then amount else 0 end)-sum(case type when 'out' then amount else 0 end) as Stock
from
(
select nd,name,vdate,amount,'in' as Type from tmp_input
union
select nd,name,vdate,amount,'out' as type from tmp_output
)
a where vdate<='2005-05-30'
group by nd,name
) d
left outer join
(
select nd,name,sum(amount) as InQty
from tmp_input
where vdate>='2005-05-01' and vdate<='2005-05-31'
group by nd,name
) e on d.nd=e.nd
left outer join
(
select nd,name,sum(amount) as OutQty
from tmp_output
where vdate>='2005-05-01' and vdate<='2005-05-31'
group by nd,name
)f on d.nd=f.nd
left outer join
(
select nd,name,
sum(case type when 'in' then amount else 0 end)-sum(case type when 'out' then amount else 0 end) as Stock
from
(
select nd,name,vdate,amount,'in' as Type from tmp_input
union
select nd,name,vdate,amount,'out' as type from tmp_output
)
g1 where vdate<='2005-04-30'
group by nd,name
) g
on d.nd=g.ndTop
40 楼icedut(冰-装修进行中)回复于 2005-06-03 16:24:20 得分 0
楼主最好加一个盘点表,用于存放上一次的盘点,这样运算量就不会很大了,应该会快一些
再加一个产品表
Top
41 楼cwm545(罪人)回复于 2005-06-03 16:40:03 得分 0
好强啊。
icedut,谢谢你,按照你的代码,我先研究一下去。。Top
42 楼qscandwh(思成)回复于 2005-06-03 16:49:05 得分 0
帮你顶,我也在写进销存的东东,刚开始达建枢架,希望交流
MSN: qscandwh@msn.com
Top
43 楼xusongping(康缘)回复于 2005-06-03 17:33:00 得分 0
看得出,各位都是专家,在下有礼了!
txtSQL = "select * from sufferExpand where [time] between # 2001-01-01# and #2005-06-03# "
我是一个VB初学者,
请教怎样写一个的语句,使用变量代替语句中的日期?Top
44 楼flyingscv(zlj)回复于 2005-06-03 17:55:14 得分 0
"select * from sufferExpand where [time] between #" & 变量1 & "# and #" & 变量2 & "# "
Top
45 楼xusongping(康缘)回复于 2005-06-03 18:23:14 得分 0
有没有专家在线呀
帮忙解决一下吗?求求你们了
Top
46 楼xusongping(康缘)回复于 2005-06-03 18:40:38 得分 0
感谢专家的帮忙,在下不胜感谢Top




