如何使用分析获得正确的摘要?

时间:2015-07-29 22:21:29

标签: sql oracle sum window-functions

如果cust_detail中出现特定的invoice_code,我希望从invoice_detail表中获取摘要编号。

在此示例中,我想仅为批次1020报告cust_detail摘要,因为它们是invoice_code='9999'的批次。但是invoice_detail表中的重复是我的数字偏差。

with
  invoice_detail as
  (
    select '10' as invoice_batch, '9999' as invoice_code from dual union all 
    select '10' as invoice_batch, '9999' as invoice_code from dual union all
    select '20' as invoice_batch, '1111' as invoice_code from dual union all
    select '30' as invoice_batch, '9999' as invoice_code from dual
  ),
  cust_detail as
  (
    select '1' as cust_id, '10' as invoice_batch, 40 as points_paid, 30 as points_earned, 30 as points_delivered from dual union all
    select '1' as cust_id, '20' as invoice_batch, 10 as points_paid, 10 as points_earned, 10 as points_delivered from dual union all
    select '1' as cust_id, '30' as invoice_batch, 20 as points_paid, 15 as points_earned,  5 as points_delivered from dual
  )
select cust_id, 
       sum(points_paid) over (partition by  c.invoice_batch
                                  order by cust_id) batch_total
  from cust_detail c
 inner join invoice_detail i on c.invoice_batch=i.invoice_batch
 where i.invoice_code = '9999';                             

期望的结果:

 CUST_ID   PAID   EARNED   DELIVERED   TOT_PAID   TOT_EARNED   TOT_DELIVERED
--------- ------ -------- ----------- ---------- ------------ ---------------
 1         40     30       30          60         45           40      
 1         20     15       5           60         45           40

2 个答案:

答案 0 :(得分:1)

您可以在加入之前使用 distinct 删除invoice_detail中的重复项:

with invoice_detail as
(
select '10' as invoice_batch, '9999' as invoice_code from dual union all 
select '10' as invoice_batch, '9999' as invoice_code from dual union all
select '20' as invoice_batch, '1111' as invoice_code from dual union all
select '30' as invoice_batch, '9999' as invoice_code from dual
),
cust_detail as
(
select '1' as cust_id, '10' as invoice_batch, 40 as points_paid, 30 as points_earned, 30 as points_delivered from dual union all
select '1' as cust_id, '20' as invoice_batch, 10 as points_paid, 10 as points_earned, 10 as points_delivered from dual union all
select '1' as cust_id, '30' as invoice_batch, 20 as points_paid, 15 as points_earned,  5  as points_delivered from dual
)
select cust_id
            ,points_paid
            ,points_earned
            ,points_delivered
            ,sum(points_paid) over (partition by c.cust_id) as tot_paid
            ,sum(points_earned) over (partition by c.cust_id) as tot_earned
            ,sum(points_delivered) over (partition by c.cust_id) as tot_delivered           
from cust_detail c 
join (select distinct * from invoice_detail) i
     on c.invoice_batch=i.invoice_batch
where i.invoice_code = '9999';

请注意,摘要包括批次 10 30 ,因为批次20包含invoice_code =' 1111'。

SQL Fiddle

答案 1 :(得分:0)

我不确定您希望的结果与您的查询有什么关系。但是,我希望您的查询看起来更像这样:

select cust_id, 
       sum(points_paid) over (partition by cust_id) as batch_total
from cust_detail c inner join
     invoice_detail i
     on c.invoice_batch=i.invoice_batch
where i.invoice_code = '9999' ;