0

我加入两个表:accn_demographicsaccn_payments。两个表之间的关系是one to many介于 accn_demographics.accn_idaccn_payments.accn_id

我的问题是,当我将 PAID_AMT 和 COPAY_AMT 相加时,我得到的数字是我应该得到的两倍/三倍/四倍。

我的情况有明显的问题join吗?

select sum(p.paid_amt) as SumPaidAmount
    , sum(p.copay_amt) as SumCoPay
    , p.pmt_date
    , d.load_Date
    , p.ACCN_ID
from  accn_payments p
join 
(
    select distinct load_date, accn_id 
    from accn_demographics
) d
    on p.ACCN_ID=d.ACCN_ID
where p.POSTED='Y'
    and p.pmt_date between '20120701' and '20120731'
group by p.pmt_date, d.load_Date,p.ACCN_ID
order by 3 desc

非常感谢您的指导。

4

3 回答 3

1

我唯一能看到的是否(select distinct load_date, accn_id from accn_demographics)可能会返回几个匹配项。查看您的数据并运行单独的查询

select distinct load_date, accn_id from accn_demographics WHERE accn_id=SomeID

其中SomeID是返回双/三值的结果帐户之一。那应该可以确定您的问题。

于 2012-08-03T16:57:27.973 回答
1

您需要在子查询中进行求和:

select sum(p.SumPaidAmount) as SumPaidAmount, sum(p.SumCoPay) as SumCoPay,
       p.pmt_date, d.load_Date, p.ACCN_ID
from  (select accn_id, p.pmt_date, sum(paid_amt) as SumPaidAmt,
              sum(copay_amt) as SumCoPay
       from accn_payments p
       where p.POSTED='Y' and
             p.pmt_date between '20120701' and '20120731'
       group by accn_id, pmt_date
      ) p join
      (select distinct load_date, accn_id from accn_demographics) d
      on p.ACCN_ID=d.ACCN_ID
group by p.pmt_date, d.load_Date,p.ACCN_ID
order by 3 desc

问题:您真的打算让 pmt_date 出现在最终结果中吗?看起来您想从外部 SELECT 和子查询中删除它。

于 2012-08-03T16:57:28.800 回答
1

是的,但对于初学者来说并不那么明显。发生的情况是,对于每条accn_payments记录,您只匹配,这意味着如果该特定accn_id的 有多个记录,那么由于连接,您将获得重复的记录。是否有另一个限制字段可以重新加入付款?accn_demographicsaccn_idaccn_paymentaccn_demographics

最终,这样想:

accn_payments (p):

accn_id    |    paid_amt    |    copay_amt    |  ...
----------------------------------------------------
1          |    100.00      |    20.00        |  ...

accn_demographics (d):

accn_id    |    load_date   |    ...
------------------------------------
1          |    2012/01/01  |    ...
1          |    2012/03/05  |    ...
1          |    2012/06/23  |    ...

加入后,您的结果将如下所示:

p.accn_id | p.paid_amt | p.copay_amt | p... | d.accn_id | d.load_date | d...
----------------------------------------------------------------------------
1         | 100.00     | 20.00       | .... | 1         | 2012/01/01  | ....
1         | 100.00     | 20.00       | .... | 1         | 2012/03/05  | ....
1         | 100.00     | 20.00       | .... | 1         | 2012/06/21  | ....

accn_payments正如您所看到的,对于每个匹配的记录,都会复制来自的同一行accn_demographics,因为您只指定了accn_id作为连接条件的列。它不能进一步限制结果,所以数据库引擎说“嘿,看,这条p记录匹配所有这些d记录,这一定是他要求的!” 显然不是预期的,因为当您对p.paid_amtand求和时p.copay_amt,它会为所有行执行求和(即使它们是重复的)。

最终,看看您是否可以accn_demographics进一步限制加入标准(也许在某个日期),这样您就可以限制加入期间重复付款记录的数量。

于 2012-08-03T16:59:19.390 回答