我正在学习服务器上的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中构建动态连接其他想法?
提前谢谢,
雷诺
1条答案
按热度按时间l7mqbcuq1#
首先,v7r1非常老…准确地说是10年。。。
其次,我不明白你想加入什么…我看不到任何东西可以解释为什么存储a在结果中有3行。
第三,在任何rdbms中都不存在“动态连接”这样的东西。可以有一个二元语句,其中可以包含一个join。或者可以有一个静态语句,也可以包含一个join。对于ibmi上的db2,只有将该语句合并到rpg/colbol程序或sql存储过程/函数中才重要。
说到这里,让我介绍一下公共表表达式(cte)。基本上与嵌套表表达式(nte)相同,但更容易理解,CTE在i上也比nte有性能优势。
这个
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中使用它。
在谷歌上搜索一下,看看你能不能开始。如果遇到问题,请在此处创建新问题(或者查看中端邮件列表