2012-05-04 36 views
0

提取物產品的價格我們有一個電話撥號誰打電話我們存儲通知他們關於天然氣價格在其區域。SQL AS/400 - 每家店

我們有3個表(WBDAPP00,WBDCIE00,WBDCIA00)

WBDAPP00是我們存儲有關呼叫的信息。
DANOID = ID
DA#INTDA#INDDA#TEL =電話號碼
DA#ENV =組呼叫的數量,我們發送1條消息發送給幾個存儲。
DASTAT =通話的狀態(按商店確認,取消運行,經我們確認,在暫停)
DADTHR =最後的狀態修改

WBDCIE00的時間戳是我們存儲有關組的信息店 CIE#EN = ID
CIEDHC =時間戳其中呼叫是有效的,我們可以稱之爲上午告訴價格將在14h30
CIE$OR改變=價格定期
CIE$PL =價格爲PL我們
CIE$SP =超級
CIE$DI =價格柴油價格

WBDCIA00是互補的有關WBDAPP00
CIA#ST =商店
CIA#AP的ID =通話的ID
CIE#EN =組呼的號碼
CIABAN =這是商店的compagny的號碼

這是這些3個表

SELECT * FROM PRDCM/WBDAPP00 WHERE DA#ENV = 17258 OR DA#ENV = 17257 
 
+--------+--------+--------+---------+--------+--------+----------------------------+-----------+--------+ 
| DANOID | DA#INT | DA#IND | DA#TEL | DA#ENV | DASTAT |   DADTHR   | DAPARM | DAMUSR | 
+--------+--------+--------+---------+--------+--------+----------------------------+-----------+--------+ 
| 100420 |  1 | 418 | 9600055 | 17257 | 4 | 2012-05-07-09.15.04.768228 |1;2;1;1;1;1| ISALAP | 
| 100421 |  1 | 819 | 7346491 | 17258 | 0 | 2012-05-07-09.23.32.362971 |0;4;0;1;0;0| ISALAP | 
| 100422 |  1 | 819 | 7624747 | 17258 | 1 | 2012-05-07-09.24.28.042330 |0;3;1;1;0;1| ISALAP | 
| 100423 |  1 | 819 | 6377874 | 17258 | 0 | 2012-05-07-09.23.32.803073 |0;3;0;1;0;1| ISALAP | 
| 100424 |  1 | 819 | 8742844 | 17258 | 1 | 2012-05-07-09.24.25.347116 |1;1;1;1;0;1| ISALAP | 
| 100425 |  1 | 819 | 8255744 | 17258 | 0 | 2012-05-07-09.23.33.207688 |1;3;1;1;0;1| ISALAP | 
+--------+--------+--------+---------+--------+--------+----------------------------+-----------+--------+ 
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 | CIABAN | 
+--------+--------+--------+--------+ 
|  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(商品說明的順序)來確定。 DASTAT需要是1或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 | productType | price | 
+--------+-------------+-------+ 
|  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 1 AND LIMIT 1

LAST AS400中不存在的,所以我需要通過 SELECT Column1,Column2 FROM table1 ORDER BY Column2 DESC LIMIT 1

更換 SELECT LAST(Column1) AS test FROM table1 我試圖與子查詢,但你不能使用ORDER BYFETCH FIRST 1 ROWS ONLY
我們在V5R1中沒有任何PTF。

這是提取

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 | 
+--------+--------+--------+----------------------------+ 

我來試試您的建議的個例。

+0

你將不得不修復你的樣本/結果數據,因爲沒有一行'CIE $ OR = 1.587'。考慮到您列出的關係,您似乎也沒有任何鏈接可以讓您將「CIA#ST = 119」連接到「CIE $ DI = 1.120」。匿名化你的數據非常棒,但我懷疑從這三個表中除了什麼_may_以外,有可能得到任何有用的東西。你能不能證明你到目前爲止所嘗試過的,只是爲了讓我們知道什麼是行不通的?並請列出您的操作系統版本(儘管我假設V6R1 +)。 –

+0

這可以通過聰明地使用子查詢和聚合分組來解決。對於'WBDCIA00'和'WBDAPP00',您有兩種不同的連接條件。 CIA#AP = DANOID'和'CIA#EN <> DA#ENV'可以存在一場比賽嗎?如果您提供表格和字段的簡要說明,可能會更容易一些。 – jamesallman

+0

@ X-Zero - >我獲得了放入真實數據的權限,所以我編輯了它。我會添加新的嘗試。我也加了我們的as400版本。 –

回答

0

坦率地說,我對你的模式有點t - - 有一些反常規我不滿意,除此之外(多值列,真的嗎?)。但是你可能改變它的能力有限,所以......如果可能的話,你應該考慮升級到至少V6R1(這就是我們所在的),因爲數據庫變得更好。謝天謝地,你還有CTE,這會有所幫助。

我假設你想要的是一個存儲(由CIEDHC給出)與DASTAT 1或4喊出了那家商店的最新價格變化,通過在呼叫時間(所以給定,如果先前的羣組電話在稍後的羣組電話之後「確認」,會發生什麼情況?)。換句話說,這不是最後的「確認」變化,而是最後的「進入」變化。

我還假設你有一個'商店'表,其中包含所有實際商店ID。但是,由於您沒有列出,我創建了一個CTE來製作一個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表示)。

+0

我沒有選擇這些文件的結構。我不能更改爲400版本。這個解決方案對我來說幾乎是完美的,因爲我只是想提取與我們撥號器管理的商店。逗號和不同的拼寫錯誤。如果我想輸出最後的常規和最後的柴油到這個SQL? 'Latest_Change'只輸出最後一次正常或最後的柴油價格。 –

+0

#修正錯誤,謝謝# - 是的,'Latest_Change'只輸出最後一個常規/柴油每行(但是,有一個錯誤導致它忽略比較中的產品類型,現在已修復)。這就是爲什麼我在最後的'SELECT'之外,'LEFT JOIN'兩次到那張桌子(每個普通一次,每個柴油一次)。這是獲得給定商店的最後一列這些列的唯一方法,這可能不會**在同一行上。 –

+0

'Latest_Change'不再正確。例如,商店502是他們的51倍,總是1.394,並且具有所有可能的柴油價值。 –