0

我们有一个电话拨号器,可以给我们的商店打电话,告知他们所在地区的汽油价格。

我们有 3 个表(WBDAPP00、WBDCIE00、WBDCIA00)

WBDAPP00是我们存储呼叫信息的地方。
DANOID= ID
DA#INT, DA#IND, DA#TEL= 电话号码
DA#ENV= 群呼号码,我们向少数商店发送 1 条消息。
DASTAT= 调用状态(Confirm by store,canceled,running,confirmed by us, in pause)
DADTHR=最后状态修改的时间戳

WBDCIE00是我们存储该组store信息的地方 CIE#EN=ID
CIEDHC=调用有效的时间戳,我们可以早上打电话告诉价格将在14h30改变
CIE$OR=普通
CIE$PL的价格=加
CIE$SP的价格=超级的价格
CIE$DI=柴油的价格

WBDCIA00是关于的补充信息WBDAPP00
CIA#ST=商店
CIA#AP的ID=呼叫
CIE#EN的ID=群呼的ID
CIABAN=这是商店的公司编号

这是这 3 个表的示例输出

SELECT * FROM PRDCM/WBDAPP00 WHERE DA#ENV = 17258 OR DA#ENV = 17257
+--------+--------+--------+---------+--------+--- -----+----------------+-----------+--- -----+
| 达诺德 | DA#INT | DA#IND | 数据#电话 | DA#ENV | 数据统计 | 爸爸 | 减震器 | 达穆斯 |
+--------+--------+--------+---------+--------+--- -----+----------------+-----------+--- -----+
| 100420 | 1 | 418 | 9600055 | 17257 | 4 | 2012-05-07-09.15.04.768228 |1;2;1;1;1;1| 伊萨拉普 |
| 100421 | 1 | 819 | 7346491 | 17258 | 0 | 2012-05-07-09.23.32.362971 |0;4;0;1;0;0| 伊萨拉普 |
| 100422 | 1 | 819 | 7624747 | 17258 | 1 | 2012-05-07-09.24.28.042330 |0;3;1;1;0;1| 伊萨拉普 |
| 100423 | 1 | 819 | 6377874 | 17258 | 0 | 2012-05-07-09.23.32.803073 |0;3;0;1;0;1| 伊萨拉普 |
| 100424 | 1 | 819 | 8742844 | 17258 | 1 | 2012-05-07-09.24.25.347116 |1;1;1;1;0;1| 伊萨拉普 |
| 100425 | 1 | 819 | 8255744 | 17258 | 0 | 2012-05-07-09.23.33.207688 |1;3;1;1;0;1| 伊萨拉普 |
+--------+--------+--------+---------+--------+--- -----+----------------+-----------+--- -----+
SELECT * FROM PRDCM/WBDCIE00 WHERE CIE#EN = 17258 OR CIE#EN = 17257
+--------+----------------+--------+-- ------+--------+--------+
| CIE#EN | CIEDHC | CIE$ 或 | CIE$PL | CIE$SP | CIE$DI |
+--------+----------------+--------+-- ------+--------+--------+
| 17257 | 2012-05-04-17.00.00.000000 | 0 | 0 | 0 | 1,359 |
| 17258 | 2012-05-07-09.30.00.000000 | 1,354 | 0 | 0 | 0 |
+--------+----------------+--------+-- ------+--------+--------+
SELECT * FROM PRDCM/WBDCIA00 WHERE CIA#EN = 17258 OR CIA#EN = 17257
+--------+--------+--------+--------+
| 中央情报局#ST | 中央情报局#AP | 中央情报局#EN | 夏班 |
+--------+--------+--------+--------+
| 96 | 100420 | 17257 | 2 |
| 316 | 100421 | 17258 | 4 |
| 320 | 100422 | 17258 | 3 |
| 321 | 100423 | 17258 | 3 |
| 338 | 100424 | 17258 | 1 |
| 366 | 100425 | 17258 | 3 |
+--------+--------+--------+--------+

这是表之间的关系
CIA#AP= DANOID
CIA#EN= CIE#EN=DA#ENV

我想为每个提取最后一个CIE$OR(不是 0)和最后一个CIE$DI(不是 0)CIA#ST
最后一个由CIEDHC(Desc order)确定。 DASTAT必须是 1 或 4。

这是我想从上面的数据中提取的一个例子:

+--------+--------+--------+
| 中央情报局#ST | CIE$ 或 | CIE$DI |
+--------+--------+--------+
| 96 | 0 | 1,359 |
| 316 | 1,354 | 0 |
| 320 | 1,354 | 0 |
| 321 | 1,354 | 0 |
| 338 | 1,354 | 0 |
| 366 | 1,354 | 0 |
+--------+--------+--------+

或者像这个,这并不理想,但在这种情况下我会容忍它

+--------+-------------+--------+
| 中央情报局#ST | 产品类型 | 价格 |
+--------+-------------+--------+
| 96 | 3 | 1,359 |
| 316 | 6 | 1,354 |
| 320 | 6 | 1,354 |
| 321 | 6 | 1,354 |
| 338 | 6 | 1,354 |
| 366 | 6 | 1,354 |
+--------+-------------+--------+

对于那些不了解 AS400 的人,FETCH FIRST 1 ROWS ONLY等于TOP 1ANDLIMIT 1

LAST在 AS400 中不存在,所以我需要替换 SELECT LAST(Column1) AS test FROM table1SELECT Column1,Column2 FROM table1 ORDER BY Column2 DESC LIMIT 1

我尝试过使用 subselect 但你不能使用ORDER BYand FETCH FIRST 1 ROWS ONLY
我们在没有任何 PTF 的 V5R1 中。

这是一个提取的例子

SELECT CIA#ST,CIE$OR,CIE$DI,CIEDHC 
FROM PRDCM/WBDAPP03 
INNER JOIN PRDCM/WBDCIE01 ON CIE#EN = DA#ENV 
INNER JOIN PRDCM/WBDCIA01 ON CIA#AP = DANOID 
WHERE DASTAT IN (1,4)
ORDER BY CIEDHC,DA#ENV
FETCH FIRST 5 ROWS ONLY
+--------+--------+--------+---------- ------+
| 中央情报局#ST | CIE$ 或 | CIE$DI | CIEDHC |
+--------+--------+--------+---------- ------+
| 88 | 1,014 | 1,039 | 2010-08-25-09.00.00.000000 |
| 89 | 1,014 | 1,039 | 2010-08-25-09.00.00.000000 |
| 90 | 1,014 | 1,039 | 2010-08-25-09.00.00.000000 |
| 91 | 1,014 | 1,039 | 2010-08-25-09.00.00.000000 |
| 119 | 1,084 | 0 | 2010-08-25-09.00.00.000000 |
| 第522章 1,014 | 1,039 | 2010-08-25-09.00.00.000000 |
+--------+--------+--------+---------- ------+

我会尝试你所有的建议。

4

1 回答 1

0

坦率地说,我对您的架构有点紧张-除其他外,我对某些非规范化不满意(真的是多值列吗?)。但是您更改它的能力可能有限,所以...如果可能,您应该考虑至少升级到 V6R1(这是我们正在使用的),因为数据库会获得更多好东西。值得庆幸的是,您仍然有 CTE,这将有所帮助。

我假设您想要的是商店的最新CIEDHC价格变化DASTAT(由在后来的一个之后被“确认”?)。换句话说,这不是最后一次“确认”更改,而是最后一次“输入”更改。

我还假设您有一个“商店”表,其中定义了所有实际的商店 ID。但是,由于您没有列出它,我创建了一个 CTE 来制造它。您可以(并且可能应该)在结果语句中将其换掉。

WITH Store (storeId) as (
            SELECT DISTINCT cia#st
            FROM Wbdcia00), 
     Price_Change (callGroup, occurredAt, productType, newPrice) as (
                   SELECT cie#en, ciedhc, 1, cie$or
                   FROM Wbdcie00
                   WHERE cie$or > 0
                   UNION ALL
                   SELECT cie#en, ciedhc, 4, cie$di
                   FROM Wbdcie00 
                   WHERE cie$di > 0), 
     Confirmed_Changes (storeId, occurredAt, productType, newPrice) as (
                        SELECT WarehouseCall.cia#st, Change.occurredAt, 
                               Change.productType, Change.newPrice
                        FROM Wbdcia00 as WarehouseCall
                        JOIN Wbdapp00 as Call
                        ON Call.danoid = WarehouseCall.cia#ap
                        AND Call.dastat IN (1, 4)
                        JOIN Price_Change as Change
                        ON Change.callGroup = da#env),
     Latest_Change (storeId, productType, newPrice) as (
                    SELECT Actual.storeId, Actual.productType, Actual.newPrice
                    FROM Confirmed_Changes as Actual
                    EXCEPTION JOIN Confirmed_Changes as Remove
                    ON Remove.storeId = Actual.storeId
                    AND Remove.productType = Actual.productType
                    AND Remove.occurredAt > Actual.occurredAt)
SELECT store.storeId, COALESCE(Regular.newPrice, 0) as regularPrice,
                      COALESCE(Diesel.newPrice, 0) as dieselPrice
FROM Store
LEFT JOIN Latest_Change as Regular
ON Regular.storeId = Store.storeId
AND Regular.productType = 1
LEFT JOIN Latest_Change as Diesel
ON Diesel.storeId = Store.storeId
AND Diesel.productType = 4

需要注意的一些事情-
我认为您实际上并没有给产品定价 0。这意味着您不是在寻找发出的单个电话,同时列出了两个价格-您要进行最后一次更改发生了,对于每个产品。这就是为什么我像以前那样旋转/取消旋转该表。
不用说,该语句报告了最后输入的“确认”更改。然而,这不是最后一次确认更改(用 表示dadthr)。

于 2012-05-07T16:49:56.630 回答