为了验证是否按时完成交付,我需要根据所需数量(SchLin)和所需数量(ReqQty)和交付数量(DlvQty)之间的比较,将交付文档与PO计划行(DlvQty)相匹配。
传递文档引用PO和POItm,但不引用SchLin。一旦将交付文档分配到调度行,我就可以计算交付达美(DlvDelta)与需求(ReqDate)相比,它早交付或晚交付的天数。
这两个基表的例子如下:
排程线
PO POItm SchLin ReqDate ReqQty
123 1 1 10/11 20
123 1 2 30/11 30
124 2 1 15/12 10
124 2 2 24/12 15送货文件
Doc Item PO POItm DlvDate DlvQty
810 1 123 1 29/10 12
816 1 123 1 02/11 07
823 1 123 1 04/11 13
828 1 123 1 06/11 08
856 1 123 1 10/11 05
873 1 123 1 14/11 09
902 1 124 2 27/11 05
908 1 124 2 30/11 07
911 1 124 2 08/12 08
923 1 124 2 27/12 09重要事项:时间表线和交货应该有相同的PO和POItm。链接的另一个逻辑是将DlvQty和到(或超过) ReqQty。然后,这些交货将与时间表联系起来。随后的交付将用于下列附表行。送货时刻表只能与一个时刻表相匹配。
在比较了ReqQty和DlvQty之后,分配的结果应该是:
结果
Doc Item PO POItm Schlin ReqDate DlvDate DlvDelta
810 1 123 1 1 10/11 29/10 -11
816 1 123 1 1 10/11 02/11 -08
823 1 123 1 1 10/11 04/11 -06
828 1 123 1 2 30/11 06/11 -24
856 1 123 1 2 30/11 10/11 -20
873 1 123 1 2 30/11 14/11 -16
902 1 124 2 1 15/12 27/11 -18
908 1 124 2 1 15/12 30/11 -15
911 1 124 2 2 24/12 08/12 -16
923 1 124 2 2 24/12 27/12 +03到目前为止,我已经使用游标循环完成了这个任务,但是性能相当缓慢。
在SQL (脚本)中是否有另一种方法,通过比较措施来实现相同的结果,从而使用例如联接?
致以敬意,
埃里克
发布于 2018-11-21 21:10:01
如果可以表示将传递与计划行匹配的规则,则可以在单个查询中生成所需的结果。而且,是的,我保证它将比在游标上的循环中执行相同的逻辑更快(也更简单)。
我不能重现你的确切结果,因为我不太明白这两个表是如何联系起来的。希望从下面的代码中,您能够通过调整联接标准来找出它。
我没有你的数据库。我的代码使用SQLite,它有自己特有的日期函数。你将不得不替代你的系统提供的。在任何情况下,我都不能推荐用于日期的5字符字符串。如果您有日期时间类型,则使用日期时间类型,并包括4位数的年份。除此之外,圣诞节和新年之间还有多少天?
create table S (
PO int not NULL,
POItm int not NULL,
SchLin int not NULL,
ReqDate char not NULL,
ReqQty int not NULL,
primary key (PO, POItm, SchLin)
);
insert into S values
(123, 1, 1, '10/11', 20 ),
(123, 1, 2, '30/11', 30 ),
(124, 2, 1, '15/12', 10 ),
(124, 2, 2, '24/12', 15 );
create table D (
Doc int not NULL,
Item int not NULL,
PO int not NULL,
POItm int not NULL,
DlvDate char not NULL,
DlvQty int not NULL,
primary key (Doc, Item)
);
insert into D values
(810, 1, 123, 1, '29/10', 12 ),
(816, 1, 123, 1, '02/11', 07 ),
(823, 1, 123, 1, '04/11', 13 ),
(828, 1, 123, 1, '06/11', 08 ),
(856, 1, 123, 1, '10/11', 05 ),
(873, 1, 123, 1, '14/11', 09 ),
(902, 1, 124, 2, '27/11', 05 ),
(908, 1, 124, 2, '30/11', 07 ),
(911, 1, 124, 2, '08/12', 08 ),
(923, 1, 124, 2, '27/12', 09 );
select D.Doc, D.Item, D.PO, S.SchLin, S.ReqDate, D.DlvDate
, cast(
julianday('2018-' || substr(DlvDate, 4,2) || '-' || substr(DlvDate, 1,2))
- julianday('2018-' || substr(ReqDate, 4,2) || '-' || substr(ReqDate, 1,2))
as int) as DlvDelta
from S join D on S.PO = D.PO and S.POItm = D.POItm
;结果:
Doc Item PO SchLin ReqDate DlvDate DlvDelta
---------- ---------- ---------- ---------- ---------- ---------- ----------
810 1 123 1 10/11 29/10 -12
810 1 123 2 30/11 29/10 -32
816 1 123 1 10/11 02/11 -8
816 1 123 2 30/11 02/11 -28
823 1 123 1 10/11 04/11 -6
823 1 123 2 30/11 04/11 -26
828 1 123 1 10/11 06/11 -4
828 1 123 2 30/11 06/11 -24
856 1 123 1 10/11 10/11 0
856 1 123 2 30/11 10/11 -20
873 1 123 1 10/11 14/11 4
873 1 123 2 30/11 14/11 -16
902 1 124 1 15/12 27/11 -18
902 1 124 2 24/12 27/11 -27
908 1 124 1 15/12 30/11 -15
908 1 124 2 24/12 30/11 -24
911 1 124 1 15/12 08/12 -7
911 1 124 2 24/12 08/12 -16
923 1 124 1 15/12 27/12 12
923 1 124 2 24/12 27/12 3 https://stackoverflow.com/questions/53416026
复制相似问题