2015-04-15 77 views
0

試圖查詢訂單標題和明細表,按月計算結果並且遇到數據模型限制。本質上,我想審覈我們的ETL過程,以確保標題級別的數據從Detail級別正確彙總。 TRANS_ID關鍵字段表示一個訂單,所以自然地,每個TRANS_ID的Detail表格將有多個行。SQL - 查詢不含複製的訂單標題和訂單明細

表ORDER_HEADER有(爲便於說明):

TRANS_ID 
TRANS_DT (DD-MON-YY) 
PROFIT 

表ORDER_DETAIL有:

TRANS_ID 
TRANS_LINE_NO 
LINE_ITM_PROFIT 

我要回答的問題是:在每月級別是什麼,從利潤總額標題和細節的總利潤是多少?我的結果應該有三列:「TRANS_DT月」,「HDR利潤」和「DTL利潤」

如果我在ORDER_HEADER.TRANS_ID = ORDER_DETAIL.TRANS_ID和GROUP BY「Month of ORDER_HEADER.TRANS_DT」我顯然會重複Header值。

我的數據量(在Oracle RDBMS中)大約是150MM標題記錄和600MM以上的詳細記錄,所以最好的解決方案在加入標題之前不會將整個Detail表加到「TRANS_ID」級。

回答

0

子查詢與聚合操作:

select oh.yyyymm, oh.hdr_profit, od.dtl_profit 
from (select to_char(trans_dt, 'YYYY-MM') as yyyymm, sum(profit) as hdr_profit 
     from order_header 
     group by to_char(trans_dt, 'YYYY-MM') 
    ) oh join 
    (select to_char(oh.trans_dt, 'YYYY-MM') as yyyymm, 
      sum(od.line_itm_profit) as dtl_profit 
     from order_header oh join 
      order_detail od 
      on oh.trans_id = od.trans_id 
     group by to_char(oh.trans_dt, 'YYYY-MM') 
    ) od 
    on oh.yyyymm = od.yyyymm; 
+0

在我看來,這將是更好的,如果order_header在不同的地方有兩個不同的別名;) – knagaev

0

一些小的修正戈登的解決方案。 注意 - 這裏只會有ORDER_HEADER表中的monthes。

select oh.TRANS_MONTH "Month of TRANS_DT", oh.PROFIT "HDR Profit", od.PROFIT "DTL Profit" 
from 
(
select TO_CHAR(TRANS_DT, 'YYYY-MM') TRANS_MONTH , SUM(LINE_ITM_PROFIT) PROFIT 
from ORDER_HEADER 
group by TO_CHAR(TRANS_DT, 'YYYY-MM') 
) oh 
left join 
(
select TO_CHAR(TRANS_DT, 'YYYY-MM') TRANS_MONTH, SUM(LINE_ITM_PROFIT) PROFIT 
from ORDER_DETAIL od 
where TRANS_ID in (select TRANS_ID from ORDER_HEADER) 
group by TO_CHAR(TRANS_DT, 'YYYY-MM') 
) od 
on oh.TRANS_MONTH = od.TRANS_MONTH 
+0

請問「OD」查詢不是很昂貴?更進一步,我假設所有的子細節記錄都有一個有效的Header父記錄,以便可以呈現'TRANS_ID(從ORDER_HEADER選擇TRANS_ID)'moot –

+0

您寫道'最好的解決方案不會將整個Detail表加到「TRANS_ID 「在加入Header之前的級別」,所以我想ORDER_DETAIL表中有ORDER_HEADER中沒有對應的記錄。 – knagaev