我在一個表中有與材料交易相關的資料,與材料相關的日志歷史標題資料在另一個表中,詳細的日志歷史資料在第三個表中。我正在嘗試獲取與物料表匹配的不同狀態更新日期,但我獲得了一個物料交易的重復行
原物料交易表:
| 訂單號 | 材料 | 數量 |
|---|---|---|
| 0001 | MAT01 | 2 |
| 0002 | MAT02 | 5 |
原始日志歷史頭事務表:
| 訂單號 | LOG_ID |
|---|---|
| 0001 | 1001 |
| 0001 | 1002 |
狀態代碼 1 表示打開,代碼 2 表示關閉
詳細日志歷史表:
| LOG_ID | 狀態代碼 | 日期 |
|---|---|---|
| 1001 | 1 | 11/12/2021 |
| 1002 | 2 | 15/12/2021 |
使用以下 SQL 查詢:
SELECT
TO_CHAR (m.order_no) order_no,
m.material,
a.date opened_date,
ab.closed_date
FROM MATERIAL_TRANSACTIONS m
INNER JOIN HISTORY_LOG t
ON m.ORDER_NO = t.ORDER_NO
INNER JOIN HISTORY_LOG_DETAILED a
ON t.LOG_ID = a.LOG_ID
AND a.STATUS_CODE = '1'
INNER JOIN HISTORY_LOG_DETAILED ab
ON t.LOG_ID = ab.LOG_ID
AND ab.STATUS_CODE = '2'
我得到以下結果:
| 訂單號 | 材料 | 數量 | OPENED_DATE | CLOSED_DATE |
|---|---|---|---|---|
| 0001 | MAT01 | 2 | 11/12/2021 | |
| 0001 | MAT01 | 2 | 15/12/2021 |
我想將狀態日期設定為如下所示的同一行:
| 訂單號 | 材料 | 數量 | OPENED_DATE | CLOSED_DATE |
|---|---|---|---|---|
| 0001 | MAT01 | 2 | 11/12/2021 | 15/12/2021 |
我會很感激我能得到的所有幫助,如果已經有類似問題的主題,我很抱歉。
uj5u.com熱心網友回復:
您的問題出現是因為您加入了歷史記錄表,該表包含訂單的 2 條記錄。如果您使用 2 個恰好包含 1 條記錄的行內表,則可以將其展平。
with opened_dates as (
select h.order_id, d.date
from history h
inner join details d on h.log_id = d.log_id and d.status_code = '1'
), closed_dates as (
select h.order_id, d.date
from history h
inner join details d on h.log_id = d.log_id and d.status_code = '2'
)
select to_char (m.order_no) order_no,
m.material,
o.date opened_date,
c.date closed_date
from material_transactions m
join opened_dates o on m.order_no = o.order_no
join closed_dates c on m.order_no = c.order_no
;
uj5u.com熱心網友回復:
只是一個想法:
我加入HISTORY_LOG 和HISTORY_LOG_DETAILED 表格以獲取特定狀態的日期,并設定為OPENED_DATE和CLOSED_DATE(如果狀態為 1 ,則打開日期為DATE列,否則將其設定為01.01.0001)
之后將這些記錄分組ORDER_NO并最大化日期值以獲得實際 OPENED_DATE和CLOSED_DATE。
最后用MATERIAL_TRANSACTIONStable加入了這個子查詢:
SELECT
TO_CHAR (M.ORDER_NO) ORDER_NO,
M.MATERIAL,
QTY,
L_T.OPENED_DATE,
L_T.CLOSED_DATE
FROM MATERIAL_TRANSACTIONS M
INNER JOIN
(
SELECT L.ORDER_NO ,
MAX( CASE WHEN LD.STATUS_CODE = 1 THEN LD.DATE ELSE TO_DATE('01.01.0001','dd.mm.yyyy') END ) OPENED_DATE
MAX( CASE WHEN LD.STATUS_CODE = 2 THEN LD.DATE ELSE TO_DATE('01.01.0001','dd.mm.yyyy') END ) CLOSED_DATE
FROM
HISTORY_LOG L
INNER JOIN HISTORY_LOG_DETAILED LD ON LD.LOG_ID = L.LOG_ID
GROUP BY L.ORDER_NO
) L_T on L_T.ORDER_NO = M.ORDER_NO
注意:我沒有測驗它。所以可能會有小的語法錯誤。請檢查它并獲得更好的幫助添加小提琴以便我可以測驗我的查詢
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/382361.html
