2016-07-21 49 views
-1

TLORDER_ALL是一種貨件的彙總表。它將向分配給此貨件的所有承運商提供總應付賬款,並且應付總額記錄在INT_PAYABLE_AMT字段中。在一對多關係中獲取準確的利潤DB2

另一方面,ORDER_INTERLINER_ALL表將列出從TLORDER_ALL表中分配到貨件的每個運輸公司的應付款。你基本上有TLORDER_ALL和ORDER_INTERLINER_ALL之間的一對多關係。支付給每個承運人的資金記錄在ORDER_INTERLINER_ALL表中的AMOUNT字段中。如果交貨後,會計決定調整應付給承運商的貨幣,應付給承運人的調整應記錄在ORDER_INTERLINER_ALL表中的ADJUSTED_AMOUNT中。如果不調整,則ADJUSTED_AMOUNT = AMOUNT。

請注意,分配給裝運的每個承運商可能有不同的貨幣付款,這是我使用INT_PAYABLE_AMT * ADJUSTED_AMOUNT/AMOUNT進行會計調整後進行轉換的原因,因爲INT_PAYABLE_AMT與CHARGES(收入)記錄的貨幣相同,字段在TLORDER_ALL表中。

Long Store short,您可能會收到以美元爲單位的收入(CHARGES字段)和以加元和/或美元貨幣結算的多個承運人。應付總額(INT_PAYABLE_AMT)在轉換後以與收入(收費)字段相同的貨幣(USD)記錄。最重要的是,您向Carrier修改的付款(讓我們稱之爲INT_PAYABLE_ADJUST_AMT)可能與INT_PAYABLE_AMT不同。

這是我的彙總查詢:

`SELECT 
T.CUSTOMER, 
T.CALLNAME, 
COUNT(T.BILL_NUMBER) LOADS, 
SUM(T.CHARGES+T.XCHARGES)TOTAL_REVENUE, 
(SUM(T.CHARGES+T.XCHARGES)-SUM(T.INT_PAYABLE_AMT) *SUM(O.ADJUSTED_AMOUNT) /SUM(O.AMOUNT)) MARGIN 
FROM TLORDER_ALL T 
INNER JOIN ORDER_INTERLINER_ALL O ON O.DETAIL_LINE_ID=T.DETAIL_LINE_ID 
WHERE T.INT_PAYABLE_AMT<>0 
AND T.CHARGES+T.XCHARGES<>0 
AND T.CUSTOMER='117990' 
AND O.INTERFACE_STATUS='I' 
AND O.AMOUNT<>0 
GROUP BY T.CUSTOMER,T.CALLNAME` 

This is output image

這是我的詳細信息查詢

SELECT 
T.DETAIL_LINE_ID, 
T.BILL_NUMBER, 
T.CUSTOMER, 
T.CALLNAME, 
(T.CHARGES+T.XCHARGES)TOTAL_REVENUE, 
(T.CHARGES+T.XCHARGES-T.INT_PAYABLE_AMT *O.ADJUSTED_AMOUNT /O.AMOUNT) MARGIN, 
T.INT_PAYABLE_AMT, 
O.ADJUSTED_AMOUNT, 
O.AMOUNT, 
O.INTERFACE_STATUS 
FROM TLORDER_ALL T 
INNER JOIN ORDER_INTERLINER_ALL O ON O.DETAIL_LINE_ID=T.DETAIL_LINE_ID 
WHERE T.INT_PAYABLE_AMT<>0 
AND T.CHARGES+T.XCHARGES<>0 
AND YEAR(T.DELIVER_BY)= YEAR(CURRENT DATE) 
AND MONTH(T.DELIVER_BY)=MONTH(CURRENT DATE)-1 
AND T.CUSTOMER='117990' 
AND O.INTERFACE_STATUS='I' 
AND O.AMOUNT<>0 

This is the output image

我的問題是,我可以如何消除同一批貨物的多個條目,因爲貨件有多個承運人,並且能夠在Summary和Details輸出中獲得準確的最終保證金?

如果我們回顧Details圖像,我想得到5條記錄不是14,並且將所有運營商應付賬款進行彙總,使用INT_PAYABLE_AMT * ADJUSTED_AMOUNT/AMOUNT對其進行轉換,並對這5條記錄的每行減去TOTAL_REVENUE。在摘要輸出中應用相同的邏輯以獲得準確的結果。

謝謝。

+0

您的格式化使問題難以閱讀,但您收到的錯誤消息似乎很清楚。如果沒有'GROUP BY',你不能使用'SUM'。 –

+0

以這種方式編寫的子查詢傾向於按行執行,並且性能受到影響(儘管如果您只查詢單個帳戶,這可能不會很大)。你的查詢目前有問題 - 如果每個細節行有多個'interface_status'行,它將會'隨機'丟棄一個,並且默默地放棄,幾乎肯定不是你想要的。你四捨五入到兩個不同的小數位。一些示例數據將有助於瞭解如何更好地構建此查詢。 –

+0

嗨,不存在「o」表「和group by子句執行一個總和...你的sql語法是錯誤的 – Esperento57

回答

0

好吧,你的總結是正確的,使CTE,然後一步一步地操作它 (注意我將所有行留在第一個CTE - 這使得它很容易調試,註釋掉所有內容並添加一個選擇驗證),每個步驟之後的值:

WITH Detail AS 
(
    SELECT 
    T.DETAIL_LINE_ID, 
    T.BILL_NUMBER, 
    T.CUSTOMER, 
    T.CALLNAME, 
    (T.CHARGES+T.XCHARGES)TOTAL_REVENUE, 
    (T.CHARGES+T.XCHARGES-T.INT_PAYABLE_AMT *O.ADJUSTED_AMOUNT /O.AMOUNT) MARGIN, 
    T.INT_PAYABLE_AMT, 
    O.ADJUSTED_AMOUNT, 
    O.AMOUNT, 
    O.INTERFACE_STATUS 
    FROM TLORDER_ALL T 
    INNER JOIN ORDER_INTERLINER_ALL O ON O.DETAIL_LINE_ID=T.DETAIL_LINE_ID 
    WHERE T.INT_PAYABLE_AMT<>0 
    AND T.CHARGES+T.XCHARGES<>0 
    AND YEAR(T.DELIVER_BY)= YEAR(CURRENT DATE) 
    AND MONTH(T.DELIVER_BY)=MONTH(CURRENT DATE)-1 
    AND T.CUSTOMER='117990' 
    AND O.INTERFACE_STATUS='I' 
    AND O.AMOUNT<>0 
), C_COMBINE AS 
(
    -- Here we combine the amounts for each leg 
    SELECT 
    DETAIL_LINE_ID, 
    CUSTOMER, 
    -- Payable amt and customer are always the same, just pick one. 
    MAX(INT_PAYABLE_AMT) AS INT_PAYABLE_AMT, 
    SUM(ADJUSTED_AMOUNT) AS SUM_ADJUSTED_AMOUNT, 
    SUM(AMOUNT) AS SUM_AMOUNT 
    FROM Detail 
    GROUP BY DETAIL_LINE_ID, CUSTOMER 
), ADJ_FOR_CURRENCY 
(
    SELECT 
    DETAIL_LINE_ID, 
    CUSTOMER, 
    INT_PAYABLE_AMT * (SUM_ADJUSTED_AMOUNT/SUM_AMOUNT) AS AMOUNT 
    FROM C_COMBINE 
) 
-- Now do what you want... roll up by customer? 
SELECT 
    CUSTOMER, 
    SUM(AMOUNT) AS TOTAL_FOR_CUSTOMER 
GROUP BY CUSTOMER 

是的,這都可以用更少的線和較少的CTE寫入 - 通過組合步驟爲一體。但是,它很難理解和寫。像這樣,很明顯,您可以添加評論和測試。例如,如果數字未正確顯示,請將選擇更改爲SELECT * FROM C_COMBINE,並驗證該步驟是否正常工作。另外,如果你使用一個像樣的優化服務器(並且db2是最好的或者在頂級的IMO中 - 我爲IBM工作,所以我可能會有偏見),這樣使用CTE通常會允許編譯器根據我的經驗制定更快的執行計劃。

祝你好運。

+0

它給出了錯誤,說INT_PAYABLE_AMT不在GROUP BY子句中Hogan,我也重新格式化了我的問題以提供更多詳細信息謝謝 – Zaur

+0

@Zaur - 我根據您的更改寫了一個新答案。我希望它有幫助。**我沒有寫出整個解決方案,所以不要指望**而是我指出你在正確的方向,並給你一些工具來使用。 – Hogan