还是没有解决,请教邹建大哥吧,如果这样的问题不是sql所能完成的,我就告诉boss,更改需求吧!
create table t
(
id int identity(1,1),
类别 varchar(20),
名称 varchar(20),
长度 int,
宽度 int,
单位 varchar(10),
价格 decimal(9,2),
数量 int,
日期 datetime,
状态 char(1)--1=入库,0=出库
)
--插入记录
/*在2006-10-1这一天入库了宽度是2米,长度是200米的涤纶10卷,价格是20元/米*/
insert into t select'布匹','涤纶',200,2,'卷',20,10,'2006-10-1','1'
/*在2006-10-1这一天出库了宽度是2米,长度是50米的涤纶1卷,价格是20元/米*/
union all select'布匹','涤纶',50,2,'卷',20,1,'2006-10-2','0'
/*
要得到以下报表
类别 名称 剩余长度 宽度 单位 价格 剩余数量 日期
布匹 涤纶 200 2 卷 20 10 2006-10-1
布匹 涤纶 150 2 卷 20 1 2006-10-2
布匹 涤纶 200 2 卷 20 9 2006-10-2
*/
drop table t
--------------------------------------------------------------------------------------
数据库说明:状态 char(1) 1代表入库,0代表出库
业务说明:
库存没有期初数
商店在2006-10-1这天进货了10卷布,每卷布的长度是200米,那么2006-10-1这天的库存为10卷
每卷的长度是200米
2006-10-2在其中一卷布上销售了50米,那么2006-10-2这天的剩余库存为,长度是200米的布匹9卷,长度是150米的布匹是1卷
这是按日期计算库存的结余数,如果2006-10-1没有出库的话,那库存的结余就是它的入库数
问题点数:10、回复次数:33Top
1 楼qw12cn()回复于 2006-10-18 14:48:25 得分 0
好象不行。
如果你3日再出库50米,你怎么确定是减150M的,还是200M的。
和实际库存很可能出现差别。
Top
2 楼fzhy_aaa()回复于 2006-10-18 14:53:59 得分 0
qw12cn() ( )
--------------
一般情况下都是整卷的批发,偶尔出库不到一卷的情况,就按照米数来计算.而且仅仅局限于一卷的范围内
如果你3日再出库50米,你怎么确定是减150M的,还是200M的。
和实际库存很可能出现差别。
这种情况列出2日库存结余,让用户进行选择,就是这样
类别 名称 剩余长度 宽度 单位 价格 剩余数量 日期
布匹 涤纶 200 2 卷 20 10 2006-10-1
布匹 涤纶 150 2 卷 20 1 2006-10-2
布匹 涤纶 200 2 卷 20 9 2006-10-2
这也是要得到的结果
Top
3 楼liangfei1983(我是杀人不眨眼,眨眼不杀人的恶魔!哈哈,怕了吧,不怕,我亲死你!!!)回复于 2006-10-18 15:02:41 得分 0
说实话,没太看懂业务逻辑!!!Top
4 楼fzhy_aaa()回复于 2006-10-18 15:10:41 得分 0
liangfei1983(lliangfei)
---------------------
其实,就是批发业务.如果是第一次入库,入库了10卷,每卷长度是200米,那么库存数就是10卷
每卷长200米.现在出库了50米,只能从其中一卷裁掉50米出库,那么剩余库存为:
长度200米的9卷
长度150米的1卷Top
5 楼bjgzxx(食人一族)回复于 2006-10-18 15:11:57 得分 0
我也是没看懂怎么回事 要实现什么功能 给的条件都没有 就让我们大家猜Top
6 楼liangfei1983(我是杀人不眨眼,眨眼不杀人的恶魔!哈哈,怕了吧,不怕,我亲死你!!!)回复于 2006-10-18 15:19:05 得分 0
我现在看懂的,也有点头绪,但我编的可能会比较复杂!!!要涉及到循环去哒
不能用一条语句搞定啊!!!Top
7 楼fzhy_aaa()回复于 2006-10-18 15:20:22 得分 0
liangfei1983(lliangfei) ( )
---------------------------
多谢了,循环也可以啊,怎样写呢?Top
8 楼bjgzxx(食人一族)回复于 2006-10-18 15:58:19 得分 0
liangqingzhi(老之)
建议使用DBComboBox和DBEdit,会方便很多。
这个建议好但是控制起来不方便Top
9 楼bjgzxx(食人一族)回复于 2006-10-18 15:58:55 得分 0
上面的发错了Top
10 楼fcuandy(了此残生.)回复于 2006-10-18 16:05:13 得分 0
意思我看明白了,用游标或循环做的话还是比较简单的.
我想想不用循环的做法.Top
11 楼fzhy_aaa()回复于 2006-10-18 16:06:57 得分 0
fcuandy(长翅膀的不一定是天使,也可能是鸟人)
谢谢了.Top
12 楼fcuandy(了此残生.)回复于 2006-10-18 16:36:52 得分 0
create table t
(
id int identity(1,1),
类别 varchar(20),
名称 varchar(20),
长度 int,
宽度 int,
单位 varchar(10),
价格 decimal(9,2),
数量 int,
日期 datetime,
状态 char(1)--1=入库,0=出库
)
insert into t select'布匹','涤纶',200,2,'卷',20,10,'2006-10-1','1'
union all select'布匹','涤纶',50,2,'卷',20,1,'2006-10-2','0'
union all select'布匹','涤纶',120,3,'卷',20,2,'2006-10-2','0'
union all select'布匹','涤纶',250,3,'卷',20,2,'2006-10-3','1'
declare @len int
set @len=200
select id,类别,名称,长度,宽度,单位,价格,数量,数量*长度 currentlen,状态,日期,
(select sum((case when 状态=0 then -1 else 1 end)*数量*长度) from t where t.id<=a.id) as allen into # from t a
select id,类别,名称,长度,宽度,单位,价格,allen/@len 数量,状态,日期 from # where 状态=1
union all
select id,类别,名称,@len,宽度,单位,价格,allen/@len,状态,日期 from # where 状态=0
union all
select id,类别,名称,allen%@len,宽度,单位,价格,case when 状态=1 then allen/@len else 1 end,状态,日期 from # where allen%@len<>0 and 状态=0
union
select id,类别,名称,长度,宽度,单位,价格,数量,状态,日期 from # where 状态=1
order by 日期,id,数量
drop table t,#
/*
1 布匹 涤纶 200 2 卷 20.00 10 1 2006-10-01 00:00:00.000
2 布匹 涤纶 150 2 卷 20.00 1 0 2006-10-02 00:00:00.000
2 布匹 涤纶 200 2 卷 20.00 9 0 2006-10-02 00:00:00.000
3 布匹 涤纶 110 3 卷 20.00 1 0 2006-10-02 00:00:00.000
3 布匹 涤纶 200 3 卷 20.00 8 0 2006-10-02 00:00:00.000
4 布匹 涤纶 250 3 卷 20.00 2 1 2006-10-03 00:00:00.000
4 布匹 涤纶 250 3 卷 20.00 11 1 2006-10-03 00:00:00.000
*/
为了写查询语句方便我用了临时表.
语句逻辑没有细想,可能会有bugTop
13 楼fzhy_aaa()回复于 2006-10-18 16:43:29 得分 0
fcuandy(长翅膀的不一定是天使,也可能是鸟人)
再次感谢,我试一下Top
14 楼fzhy_aaa()回复于 2006-10-18 16:47:42 得分 0
fcuandy(长翅膀的不一定是天使,也可能是鸟人)
有个小问题,如果按照日期进行查询的话,应该把条件写在什么位置上?Top
15 楼fcuandy(了此残生.)回复于 2006-10-18 16:53:27 得分 0
select id,类别,名称,长度,宽度,单位,价格,数量,数量*长度 currentlen,状态,日期,
(select sum((case when 状态=0 then -1 else 1 end)*数量*长度) from t where t.id<=a.id and 日期...) as allen into # from t a where 日期...
在这两个地方加就可以了.
忽略了一点,进货如果布长度超过200,这个又怎么算?比如 240... 如果实际上进的都是200的那就不存在这个问题.Top
16 楼fzhy_aaa()回复于 2006-10-18 17:07:22 得分 0
忽略了一点,进货如果布长度超过200,这个又怎么算?比如 240... 如果实际上进的都是200的那就不存在这个问题.
------------------------------------------
是这样进货的,有可能进两批,一批是长度是200,另一批长度是300,这时候会有影响吗?是否按照长度来分组,另外也有这种情况,进两批,但是价格不同,是否也应该按照价格来分组Top
17 楼fzhy_aaa()回复于 2006-10-18 17:10:01 得分 0
我觉得的按照"类别","名称","长度","宽度","价格"来分组,这样才能做到通用化.
能否把sql改写成这样?Top
18 楼fcuandy(了此残生.)回复于 2006-10-18 17:17:05 得分 0
你这个分组好似没有意义.分组用于汇总,统计之类的.而看你的要求,应该是要某类商品的库存明细历史记录. 一次查出所有物品的明细历史记录做也是可以做到的,不过复杂程度高多了.Top
19 楼fzhy_aaa()回复于 2006-10-18 17:26:45 得分 0
fcuandy(长翅膀的不一定是天使,也可能是鸟人)
这样的明细帐也能出来,真是好厉害
---------------------------
我要分组的原因,是考虑到有别的种类,比如"绸缎",下面有名称"丝绸"等.另外还有同一种布匹,价格不同的情况
Top
20 楼fzhy_aaa()回复于 2006-10-18 17:28:58 得分 0
看你的要求,应该是要某类商品的库存明细历史记录.
-------------------------------
要求是得到当天的库存结余数.这样在前台程序中,就可以列出一个列表,让库管选择一下库存的结余商品,进行出库操作Top
21 楼liangfei1983(我是杀人不眨眼,眨眼不杀人的恶魔!哈哈,怕了吧,不怕,我亲死你!!!)回复于 2006-10-18 17:37:59 得分 0
按照你的要求,这条SQL语句,我认为将为是非常麻烦的!!!!因为要考虑的东西太多哒!!!
Top
22 楼fzhy_aaa()回复于 2006-10-18 17:40:25 得分 0
liangfei1983(lliangfei)
-----------------------------------
是好麻烦啊,难度不小.Top
23 楼netcup(茶杯)回复于 2006-10-18 18:10:45 得分 0
这个问题不难,和我过去的一个要求差不多,你的200米应该是一个规格吧?Top
24 楼exinke(新克)回复于 2006-10-19 08:24:59 得分 0
表结构中再加上一列: InID int, 记录是哪笔入库的记录,状态char(1)=0时用;
这样查询应该可以写的出来
学习中……Top
25 楼fzhy_aaa()回复于 2006-10-19 09:13:58 得分 0
fcuandy(长翅膀的不一定是天使,也可能是鸟人)
---------------------------------------------------------------
有个问题:
如果把入库记录改写成这样
insert into t select'布匹','涤纶',200,2,'卷',20,10,'2006-10-1','1'
union all select'布匹','涤纶',200,2,'卷',20,10,'2006-10-1','1'
那么结果为:
布匹 涤纶 200 2 卷 20.00 10 1 2006-10-01
布匹 涤纶 200 2 卷 20.00 10 1 2006-10-01 布匹 涤纶 200 2 卷 20.00 20 1 2006-10-01 -----------------------------------------
而要得到的结果为:
布匹 涤纶 200 2 卷 20.00 20 1 2006-10-01
以上情况就是,只有入库操作,没有出库操作的情况下,库存结余数是20
Top
26 楼fzhy_aaa()回复于 2006-10-19 09:15:18 得分 0
netcup(茶杯)
----------------------------------
对,200米是一个规格,你有这样方面的经验吗,告诉我怎么做可以吗Top
27 楼cai114(硬鸡常空(KingKong归来))回复于 2006-10-19 10:11:23 得分 0
是否可以这样?将物料编码写成动态的?200为手输,如果卖出50米物料编码就变成150
我是做毛线的,不认同者还请指教Top
28 楼fzhy_aaa()回复于 2006-10-19 10:29:18 得分 0
将物料编码写成动态的?200为手输
---------------------
是指出库还是入库?Top
29 楼hznxcgh2006()回复于 2006-10-19 11:43:10 得分 0
不錯,都是高手,學習中。。。。Top
30 楼netcup(茶杯)回复于 2006-10-19 17:35:16 得分 0
若是规格,那就看能否被取模作为拆零的依据.我回去翻下资料Top
31 楼prcgolf(小鸟)回复于 2006-10-27 11:59:19 得分 0
upTop
32 楼StarRains(星雨)回复于 2006-10-27 13:05:09 得分 0
数据结构的设计是不是应该改进一下,就像二楼说的:
如果你3日再出库50米,你怎么确定是减150M的,还是200M的。
和实际库存很可能出现差别Top
33 楼xchd545(男才女貌?男财女貌?男财女毛?!)回复于 2006-10-27 13:37:49 得分 0
高手真多,Top




