Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
预测实现sql查询_Sql_Oracle - Fatal编程技术网

预测实现sql查询

预测实现sql查询,sql,oracle,Sql,Oracle,我遇到了这样一个需求:我需要编写sql查询,根据仓库级别和销售级别将库存从一个位置填充到另一个位置。 以下是场景: 我有一张表有产品A的剩余量(表1) 我有另一个表,其中包含产品A的所需数量(预测)(表2) 我需要根据产品等级将产品数量从(表1)A发送到(表2)B(对于SOH_RNK,对于B SLS_RNK) 表1: PROD_ID SOH_RNK QTY STORE_ID_A A 1 30 30105 A 2 16 21168 A

我遇到了这样一个需求:我需要编写sql查询,根据仓库级别和销售级别将库存从一个位置填充到另一个位置。 以下是场景: 我有一张表有产品A的剩余量(表1) 我有另一个表,其中包含产品A的所需数量(预测)(表2)

我需要根据产品等级将产品数量从(表1)A发送到(表2)B(对于SOH_RNK,对于B SLS_RNK)

表1:

PROD_ID SOH_RNK QTY STORE_ID_A
A           1   30  30105
A           2   16  21168
A           3   10  21032
A           4   9   30118
A           9   6   30011
A           10  5   21190
A           13  2   21016
PROD_ID SLS_RNK Forcast_QTY STORE_ID_B
A           1       15      21005
A           2       10      30019
A           3       11      21006
A           4       16      30001
A           5       11      21015
A           6       7       21004
Store_ID_B  Store_id_A  Transferred_Qty_from_A
21005           30105           15
30019           30105           10
21006           30105           5
21006           21168           6
30001           30105           0
30001           21168           10
30001           21032           6
21015           30105           0
21015           21168           0
21015           21032           4
21015           30118           7
21004           30105           0
21004           21168           0
21004           21032           0
21004           30118           2
21004           30011           5
表2:

PROD_ID SOH_RNK QTY STORE_ID_A
A           1   30  30105
A           2   16  21168
A           3   10  21032
A           4   9   30118
A           9   6   30011
A           10  5   21190
A           13  2   21016
PROD_ID SLS_RNK Forcast_QTY STORE_ID_B
A           1       15      21005
A           2       10      30019
A           3       11      21006
A           4       16      30001
A           5       11      21015
A           6       7       21004
Store_ID_B  Store_id_A  Transferred_Qty_from_A
21005           30105           15
30019           30105           10
21006           30105           5
21006           21168           6
30001           30105           0
30001           21168           10
30001           21032           6
21015           30105           0
21015           21168           0
21015           21032           4
21015           30118           7
21004           30105           0
21004           21168           0
21004           21032           0
21004           30118           2
21004           30011           5
预期输出:

PROD_ID SOH_RNK QTY STORE_ID_A
A           1   30  30105
A           2   16  21168
A           3   10  21032
A           4   9   30118
A           9   6   30011
A           10  5   21190
A           13  2   21016
PROD_ID SLS_RNK Forcast_QTY STORE_ID_B
A           1       15      21005
A           2       10      30019
A           3       11      21006
A           4       16      30001
A           5       11      21015
A           6       7       21004
Store_ID_B  Store_id_A  Transferred_Qty_from_A
21005           30105           15
30019           30105           10
21006           30105           5
21006           21168           6
30001           30105           0
30001           21168           10
30001           21032           6
21015           30105           0
21015           21168           0
21015           21032           4
21015           30118           7
21004           30105           0
21004           21168           0
21004           21032           0
21004           30118           2
21004           30011           5

到目前为止,我已经尝试了交叉连接,但并没有多大帮助。我试图避免程序性的做法,因为这将是一行一行的,我有2000万这样的记录

想法是确定两个表中的数量范围,然后根据这些范围连接两个表,以获得从源商店发送到目标商店的产品数量。

这是计算第一个表的范围的查询示例(第二个表的查询与此类似):


现在,当两个表中的两个数据范围相互重叠时,我们可以连接两个表中的记录。
检查两个范围是否重叠的公式如下:

它是:
NOT(EndA=EndB)


最后一个问题是:

WITH  t1 AS (
  select t1.*,
         coalesce(sum( qty ) over ( order by soh_rnk range between unbounded preceding and 1 preceding),0) As range_start,
         sum( qty ) over ( order by soh_rnk ) As range_end
  from table1 t1
),
t2 As (
    select t2.*,
           coalesce(sum( forecast_qty ) over ( order by sls_rnk range between unbounded preceding and 1 preceding),0) As range_start,
           sum( forecast_qty ) over ( order by sls_rnk ) As range_end
    from table2 t2
)
SELECT 
       t1.store_id_a,
       t2.store_id_b,
       least( t1.range_end, t2.range_end ) - greatest( t1.range_start, t2.range_start ) As Transferred_Qty_from_A
FROM t1
join t2
-- NOT (EndA <= StartB or StartA >= EndB)
on not ( t1.range_end <= t2.range_start OR t1.range_start >= t2.range_end)
   and t1.prod_id = t2.prod_id
order by soh_rnk, sls_rnk
;


不幸的是,我不知道如何在结果集中包含数量为
0
的记录(当没有任何产品从第一家商店转移到第二家商店时)。

这些条件可以满足许多组合。商店B的实现将基于商店A的库存及其排名。例如,21005商店需要15个数量。因此,由于30105商店的soh_rnk是第一位的,因此它将从库存中转移数量。感谢这种创新方法。这就像魅力:)@krokodilko我刚刚偶然发现了一个与我类似的问题。如果我需要以最小的迭代次数将产品数量从(表1)A发送到(表2)B。是否可以使用间隔重叠?