簡體   English   中英

JD Edwards E1 (DB2) 的復雜 SQL 查詢幫助

[英]Complicated SQL query help for JD Edwards E1 (DB2)

讓我先承認我不是數據庫或 SQL 專家。 我知道基本的查詢,並且做了一些稍微復雜的查詢,但這超出了我的理解。

背景

我的公司將 JD Edwards Enterprise One 用於他們的 ERP 應用程序。 下表由本系統中的實際表格表示。 為了簡單起見,我在下面解釋了它們。 后端數據庫是運行在 AS/400 平台上的 DB2。

表定義

表:項目分類帳 (IL)
列:

Business Unit
Work Center
Order #
Doc Type
Trans. Date
Qty Completed

表:無時間交易 (WOT)
列:

Business Unit
Work Center
Order #
Hours Type
G/L Date
Hours Worked

筆記:

  • 實際上,這些表的列比此處顯示的要多得多。
  • 查詢需要過濾項目分類帳,使得文檔類型 = “IC”。
  • 查詢需要過濾時間事務,使得 hours type = “3”。

樣本數據

注意:為糟糕的格式道歉,但似乎沒有辦法在這個場地很好地代表一張桌子。

項目分類帳 (IL)

Business Unit   Work Center Order # Doc Type    Trans. Date Qty Completed
BU-1    WC-1    1   IC  8/7/20  20
BU-1    WC-1    1   IC  8/7/20  40
BU-1    WC-1    2   IC  8/7/20  10
BU-1    WC-2    3   IC  8/7/20  40
BU-1    WC-2    3   IC  8/7/20  10
BU-2    WC-4    6   IC  8/7/20  10
BU-2    WC-5    5   IC  8/7/20  60
BU-1    WC-1    2   IC  8/6/20  50
BU-1    WC-3    4   IC  8/6/20  30
BU-2    WC-5    5   IC  8/5/20  50
BU-2    WC-5    7   IC  8/1/20  20
BU-2    WC-5    8   IC  7/26/20 30
BU-2    WC-5    8   IC  7/25/20 50

無時間交易 (WOT)

Business Unit   Work Center Order # Hours Type  G/L Date    Hours Worked
BU-2    WC-4    6   3   8/8/20  7.4
BU-1    WC-1    1   3   8/7/20  3.92
BU-1    WC-2    3   3   8/7/20  8
BU-1    WC-2    3   3   8/7/20  7
BU-1    WC-3    4   3   8/7/20  6.2
BU-2    WC-4    6   3   8/7/20  1.1
BU-1    WC-1    2   3   8/6/20  1.57
BU-2    WC-5    7   3   8/1/20  3.9
BU-2    WC-5    8   3   7/25/20 11.3

注意:時間事務表中沒有訂單#5 的條目。

目標

目標1:

我們正在嘗試按業務部門(例如 BU-1)和工作中心(例如 WC-1)分組,按周匯總(未來:添加其他時間范圍,如按月)。

需要注意的重要事項是,項目分類帳中的給定日期可能有多個完成,並且與這些完成相對應的工作時間的時間事務中的條目數量可能要少得多(有時只有一個)。 在某些情況下,工作時間條目可能要到第二天才能發布(這是一個 24x7 的輪班操作),在這種情況下,相關事件(給定訂單的完成和工時記錄)是在不同的日子。

如果我們將這兩個表中的數據融合在一起,其中訂單號是常見的關系:

注意:我是手動組裝的,所以可能會有錯誤。

Business Unit   Work Center Order # Date    Hours Worked    Qty Completed
BU-2    WC-4    6   8/8/20  7.4 null
BU-1    WC-1    1   8/7/20  3.92    60
BU-1    WC-1    2   8/7/20  null    10
BU-1    WC-2    3   8/7/20  15  50
BU-1    WC-3    4   8/7/20  6.2 null
BU-2    WC-4    6   8/7/20  1.1 10
BU-2    WC-5    5   8/7/20  null    60
BU-1    WC-1    2   8/6/20  1.57    50
BU-1    WC-3    4   8/6/20  null    30
BU-2    WC-5    5   8/5/20  null    50
BU-2    WC-5    7   8/1/20  3.9 20
BU-2    WC-5    8   7/26/20 null    30
BU-2    WC-5    8   7/25/20 11.3    50

現在,按業務部門、工作中心分組並按周總計:

Week    Business Unit   Work Center Hours Worked    Qty Completed
8/2/20 – 8/8/20             
    BU-2    WC-4    8.5 10
    BU-1    WC-1    5.49    120
    BU-1    WC-2    15  50
    BU-1    WC-3    6.2 30
    BU-2    WC-5    0   50
7/26/20 – 8/1/20                
    BU-2    WC-5    3.9 50
7/19/20 – 7/25/20               
    BU-2    WC-5    11.3    50

我不知道實現此結果的正確 SQL 查詢。 我認為這需要一個完整的外部連接,但我嘗試過的一切似乎都會為結果集產生某種笛卡爾積,這只是將兩個表中的數據組合在一起的第一步,沒關系最終聚合和分組。

任何關於如何編寫查詢(或者可能是多個查詢?)來實現這種結果的幫助和建議將不勝感激。

更新(20 年 8 月 14 日):

我試圖根據https://stackoverflow.com/users/10418264/mark-barinstein (Mark Barinstein) 的建議來實現查詢。 我已經分析了建議的查詢,我想我大部分都理解了。

我正在努力將 JD Edwards Julian 日期轉換為可用於計算一年中星期幾的表格。 這是可能的最新嘗試。 請注意,此處使用的是實際的表名和列名。

SELECT
  COALESCE(ILG.Week, WOG.Week) AS WEEK,
  COALESCE(ILG.BU, WOG.BU) AS BU,
  COALESCE(ILG.WC, WOG.WC) AS WC,
  COALESCE(WOG.Hours, 0) AS HOURS,
  COALESCE(ILG.Qty, 0) AS QTY
FROM
  (
    SELECT
      F31122.WTMMCU AS BU,
      F31122.WTMCU AS WC,
      WEEK(DATE(CAST(1900 + F31122.WTDGL/1000 AS CHAR(4)) || '-01-01') + (MOD(F31122.WTDGL, 1000) - 1) DAYS) AS Week,
      SUM(F31122.WTHRW) AS Hours
    FROM PROD2DTA.F31122 AS F31122
    WHERE
      (F31122.WTTYR IN ('3')) AND
      (F31122.WTDGL BETWEEN 120200 AND 120201)
    GROUP BY
      F31122.WTMMCU,
      F31122.WTMCU
  ) WOG
FULL JOIN
  (
    SELECT
      F4111.ILMCU AS BU,
      F4111.ILLOCN AS WC,
      WEEK(DATE(CAST(1900 + F4111.ILTRDJ/1000 AS CHAR(4)) || '-01-01') + (MOD(F4111.ILTRDJ, 1000) - 1) DAYS) AS Week,
      SUM(F4111.ILTRQT) AS Qty
    FROM PROD2DTA.F4111 AS F4111
    WHERE
      (F4111.ILDCT IN ('IC')) AND
      (F4111.ILTRDJ BETWEEN 120200 AND 120201)
    GROUP BY
      F4111.ILMCU,
      F4111.ILLOCN
  ) ILG
ON ILG.BU = WOG.BU AND ILG.WC = WOG.WC AND ILG.WEEK = WOG.WEEK
ORDER BY 1 DESC, 2, 3

有沒有辦法簡化將 JDE Julian 日期轉換為周數的邏輯? 我了解正在做什么,但希望我可以將其分解為 function 並調用它。

我仍然收到錯誤:

[SQL0122] Column WTDGL or expression in SELECT list not valid. (JdbcException)

不同的問題:可以在 GROUP BY 子句中使用“別名”列(例如BU而不是F4111.ILMCU )嗎? 它會使它更具可讀性。

嘗試這個:

SELECT
  COALESCE(ILG.WEEK, WOG.WEEK) AS WEEK
, COALESCE(ILG.BU, WOG.BU) AS BU
, COALESCE(ILG.WC, WOG.WC) AS WC
, COALESCE(WOG.Hours, 0) AS HOURS
, COALESCE(ILG.Qty, 0) AS QTY
FROM
(
SELECT BU, WC, WEEK(TO_DATE(GL_Date, 'MM/DD/YY')) AS Week, SUM(Hours) AS Hours
FROM WO
GROUP BY BU, WC, WEEK(TO_DATE(GL_Date, 'MM/DD/YY'))
) WOG
FULL JOIN
(
SELECT 
  BU, WC
, WEEK(TO_DATE(Trans_Date, 'MM/DD/YY')) AS Week
, SUM(Qty) AS Qty
FROM IL
GROUP BY BU, WC, WEEK(TO_DATE(Trans_Date, 'MM/DD/YY'))
) ILG ON ILG.BU = WOG.BU AND ILG.WC = WOG.WC AND ILG.WEEK = WOG.WEEK
ORDER BY 1 DESC, 2, 3

db<>fiddle鏈接來測試它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM