SQL DB2:如何使用“运行总计计算”连接Dynamicly 2表
我正在学习服务器上的SQL:IBMV7R1M0,DB2 我正在尝试构建一个SQL报表。 在寻找了几天类似的例子后,我在知识的海洋中发射了这个瓶子 背景: 商店向仓库索取货物。 那些货物是用货盘挑的。 在将这些货盘装入卡车之前,将其放在暂存车道上 规则1:我们只需要一个货架上的货盘,我们不想把不同货架上的货盘混在一起 规则2:商店将占用附近的暂存通道 规则3:暂存车道按有间隙的there ID排序 表1:SQL DB2:如何使用“运行总计计算”连接Dynamicly 2表,sql,db2-400,Sql,Db2 400,我正在学习服务器上的SQL:IBMV7R1M0,DB2 我正在尝试构建一个SQL报表。 在寻找了几天类似的例子后,我在知识的海洋中发射了这个瓶子 背景: 商店向仓库索取货物。 那些货物是用货盘挑的。 在将这些货盘装入卡车之前,将其放在暂存车道上 规则1:我们只需要一个货架上的货盘,我们不想把不同货架上的货盘混在一起 规则2:商店将占用附近的暂存通道 规则3:暂存车道按有间隙的there ID排序 表1: |-----|-----|-----------------| | ID |store|p
|-----|-----|-----------------|
| 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
你将如何开始构建它?
-有窗口功能吗?合计
-使用递归SQL?声明获取
-是否可以在SQL中构建动态联接?
-其他想法
提前感谢,
雷诺首先,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;
带T1 as的是常用的表表达式;T2和安装也是如此。with关键字仅用于第一个CTE
设备CTE连接T1和T2,根据该估算适合车道描述,为每个可能性分配一个行号。最终选择对每个车道进行第一次拟合
CTE的好处在于,您可以轻松地构建它们,并在进行过程中看到结果。在任何时候,您都可以从MYCTE添加select*并查看到目前为止的情况
注意,如图所示,一个CTE可以引用另一个CTE。安装参考T1和T2
编辑
在结果集中向前或向后使用的函数名为LAG和LEAD。它们是内置DB2fori的一部分。不幸的是,它们是在7.3添加的
您需要使用用户定义的函数UDF滚动您自己的版本,该函数使用已知的scatchpad来保存每行函数调用之间的数据
我发现了一篇非常古老的文章,展示了如何在RPG中使用scratch pad。您还可以在SQL定义的UDF中使用它
用谷歌搜索一下,看看你是否可以开始。如果遇到问题,请在此处创建新问题。或者查看你好,查尔斯,谢谢你抽出时间。