通过比较度量值或使用游标循环来实现SQL Join?

时间:2018-11-21 16:03:22

标签: sql hana-sql-script

为了验证是否按时完成交货,我需要根据所需数量(ReqQty)和交货数量(DlvQty)之间的比较,将交货单据与PO计划行(SchLin)相匹配。

Delivery Docs引用了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(脚本)中是否有另一种方式使用通过比较措施加入以达到相同结果?

此致

埃里克

1 个答案:

答案 0 :(得分:0)

如果您可以表达将交货与计划行匹配的规则,则可以在单个查询中产生所需的结果。而且,是的,我保证它将比在游标上的循环中执行相同的逻辑更快(更简单)。

由于我不太了解这两个表之间的关系,因此无法重现您的确切结果。希望从下面的代码中,您可以通过调整联接条件来解决这个问题。

我没有您的DBMS。我的代码使用SQLite,它具有自己的特殊日期函数。您必须替换系统提供的内容。无论如何,我不建议为日期使用5个字符的字符串。如果您有日期时间类型,请使用datetime类型,并包括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         
相关问题