尝试查询订单标题和明细表以按月汇总结果并遇到数据模型限制。本质上,我想审核我们的ETL过程,以确保从详细级别正确聚合标题级数据。 TRANS_ID键字段表示一个订单,因此,Detail表每个TRANS_ID会有几行。
表ORDER_HEADER(为了便于说明):
TRANS_ID
TRANS_DT (DD-MON-YY)
PROFIT
表ORDER_DETAIL有:
TRANS_ID
TRANS_LINE_NO
LINE_ITM_PROFIT
我想回答的问题是:在月份级别,标题的总利润是什么?详细信息的总利润是多少?我的结果应该有三列:" TRANS_DT月和#34;," HDR利润"和" DTL利润"
如果我内部加入ORDER_HEADER.TRANS_ID = ORDER_DETAIL.TRANS_ID和GROUP BY"月份ORDER_HEADER.TRANS_DT"那么我显然会复制Header值。
我的数据量(在Oracle RDBMS中)大约是150MM标题记录和600MM以上的详细记录,因此最佳解决方案不会将整个明细表汇总到" TRANS_ID"加入标题之前的级别。
答案 0 :(得分: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;
答案 1 :(得分:0)
戈登解决方案的一些小修正。 注意 - 这里只有几个月的ORDER HEADER表。
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