sqldb2:如何使用“running total calculations”连接dynamicaly 2表

iyfjxgzm  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(271)

我正在学习服务器上的sql:IBMV7R1M0、db2。
我正在尝试构建sql报表。在寻找了几天类似的例子之后,我在知识的海洋中发射了这个瓶子。。。
上下文:商店向仓库请求货物。那些货物是用货盘拣的。这些货盘将被放在暂存车道上,然后再装上卡车。
规则1:我们只需要一个货架上一个商店的货盘(我们不想把不同商店的货盘混在一起)
规则2:商店将占用附近的临时通道。
规则3:临时通道按其id排序(带间隙)
表1:

|-----|-----|-----------------|
| ID  |store|pallet_estimation|
|-----|-----|-----------------|
| 1   | A   | 35              |
| 2   | C   |  2              |
| 3   | B   | 30              |
|-----|-----|-----------------|

SELECT * FROM (
    VALUES (1, 'A', 35), (2, 'C', 2), (3, 'B', 30)
          ) T1(ID, store, pallet_estimation)

表2:

|---------------|---------------|
|ID_staging_lane|pallet_capacity|
|---------------|---------------|
| 201           | 10            |
| 202           | 10            |
| 204           | 30            |
| 205           | 40            |
| 208           | 30            |
| 210           | 30            |
|---------------|---------------|

SELECT * FROM(
  VALUES (201, 10), (202, 10), (204, 30), (205, 40), (208, 30), (210, 30)
     ) T2(ID_staging_lane, pallet_capacity)

预期结果:

|-----------|--------|--------------------|---------------|------------------|
|T1_sequence|T1_store|T1_pallet_estimation|T2_staging_lane|T2_pallet_capacity|
|-----------|--------|--------------------|---------------|------------------|
| 1         | A      | 35                 | 201           | 10               |
| 1         | A      | 35                 | 202           | 10               |
| 1         | A      | 35                 | 204           | 30               |
| 2         | C      |  2                 | 205           | 40               |
| 3         | B      | 30                 | 208           | 30               |
|-----------|--------|--------------------|---------------|------------------|

查尔斯,谢谢你抽出时间。我会努力提高我的要求。
如果需要的话,我想按照顺序拆分/划分多个中转车道上的托盘估计
例子:

For store A which has 35 pallets, 
I want to use staging lane 201 then it remains 35 - 10 = 25 , 
then I want to use staging lane 202 then it remains 25 - 10 = 15, 
then I want to use staging lane 204 then it remains 15 - 30 = -15

then I want to continue with the store C on the next staging lane 205 then it remains 2 - 40 = -38

then I want to continue with the store B on the next staging lane 208 then it remains 30 - 30 = 0

你打算怎么开始建造有窗口功能吗?sum()over()—使用递归sql?declare fetch-是否可以在sql中构建动态连接其他想法?
提前谢谢,
雷诺

l7mqbcuq

l7mqbcuq1#

首先,v7r1非常老…准确地说是10年。。。
其次,我不明白你想加入什么…我看不到任何东西可以解释为什么存储a在结果中有3行。
第三,在任何rdbms中都不存在“动态连接”这样的东西。可以有一个二元语句,其中可以包含一个join。或者可以有一个静态语句,也可以包含一个join。对于ibmi上的db2,只有将该语句合并到rpg/colbol程序或sql存储过程/函数中才重要。
说到这里,让我介绍一下公共表表达式(cte)。基本上与嵌套表表达式(nte)相同,但更容易理解,CTE在i上也比nte有性能优势。

with T1 as (
  SELECT * FROM (
    VALUES (1, 'A', 35), (2, 'C', 2), (3, 'B', 30)
          ) T1(ID, store, pallet_estimation)
), T2 as (
SELECT * FROM(
  VALUES (201, 10), (202, 10), (204, 30), (205, 40), (208, 30), (210, 30)
     ) T2(ID_staging_lane, pallet_capacity)
), fitment as (
select T1.*, T2.*, row_number() OVER(partition by ID_STAGING_LANE) as rowNbr
from T1 join T2 on pallet_estimation <= pallet_capacity
)
select * from fitment where rowNbr = 1;

这个 with T1 as (<select statement>) 是公共表表达式;原样 T2 以及 fitment . 这个 with 关键字仅用于第一个cte。
这个 fitment cte将t1和t2连接在一起,根据这两个估计值适合车道描述,为每个可能性分配一个行号。最终选择对每条车道进行第一次拟合。
关于cte的好处是你可以很容易地建立他们,并看到你的结果。你可以随时添加 select * from MYCTE 看看你现在有什么。
注意,如图所示,一个cte可以引用另一个cte( fitment 引用两者 T1 以及 T2 )
编辑
您需要在结果集中向前或向后使用的函数被命名为 LAG() 以及 LEAD() . 它们是DB2fori内置的olap功能的一部分。不幸的是,它们被添加到了7.3。
您将需要使用一个用户定义函数(udf)来滚动您自己的版本,该函数使用已知的 scatchpad 为每一行保存函数调用之间的数据。
我在sql的scratchpad上发现了一篇很老的文章,上面写着如何在rpg中使用scratchpad。也可以在sql定义的udf中使用它。
在谷歌上搜索一下,看看你能不能开始。如果遇到问题,请在此处创建新问题(或者查看中端邮件列表

相关问题