0

私たちの店に電話して、その地域のガス価格について知らせる電話ダイヤラーがいます。

3 つのテーブル (WBDAPP00、WBDCIE00、WBDCIA00) があります。

WBDAPP00通話に関する情報を保存する場所です。
DANOID= ID
DA#INT, DA#IND, DA#TEL= 電話番号
DA#ENV= グループ通話の数, 1 つのメッセージをいくつかの店舗に送信します.
DASTAT= 通話のステータス (ストアによる確認、キャンセル済み、実行中、当社による確認、一時停止中)
DADTHR= 最後のステータス変更のタイムスタンプ

WBDCIE00ストアのグループに関する情報を保存する場所 CIE#EN= ID
CIEDHC= 電話が有効なタイムスタンプ。午前中に電話して、14 時 30 分に価格が変更されることを伝えることができます
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#TEL | DA#ENV | ダスタット | DADTHR | ダットスール | ダパーム | ダムスール |
+--------+--------+--------+---------+--------+--- ---+----------------------------+----------+--- ------+
| | 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$OR | 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
+--------+--------+--------+--------+
| | CIA#ST | CIA#AP | CIA#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(降順) によって決定されます。 DASTAT1 または 4 である必要があります。

これは、上記のデータから抽出したい例です。

+--------+--------+--------+
| | CIA#ST | CIE$OR | 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 |
+--------+--------+--------+

または、このようなものは理想的ではありませんが、この場合は許容します

+--------+-------------+-------+
| | CIA#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 を知らない人のために、はANDFETCH FIRST 1 ROWS ONLYに等しいTOP 1LIMIT 1

LASTSELECT LAST(Column1) AS test FROM table1 AS400には存在し ないので、置き換える必要があります SELECT Column1,Column2 FROM table1 ORDER BY Column2 DESC LIMIT 1

ORDER BYsubselect を試してみましたが、 andは使用できません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
+--------+--------+--------+---------------------- ------+
| | CIA#ST | CIE$OR | 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) であり、その店舗への呼び出しが call-time によって与えられるのではなくDASTAT、1 または 4 であると想定しています(したがって、以前のグループ呼び出しがあった場合はどうなりますか)後のものの後に「確認」されていますか?)。つまり、これは最後に「確認された」変更ではなく、最後に「入力された」変更です。

また、実際の店舗 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 に答える