0

accn_demographicsとの 2 つのテーブルを結合していaccn_paymentsます。2 つのテーブルの関係はone to manyaccn_demographics.accn_idaccn_payments.accn_id

私の質問は、PAID_AMT と COPAY_AMT を合計すると、得られるはずの数値が 2 倍/3 倍/4 倍になるということです。

私の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で、ダブル/トリプル値を返す結果アカウントの 1 つです。それはあなたの問題を特定するはずです。

于 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_idaccn_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ごとに の同じ行が複製されます。これ以上結果を制限することはできないため、DB エンジンは「ほら、このレコードはこれらすべてのレコードに一致します。これは彼が求めていたものに違いありません!」と言った場合です。and で合計すると、すべての行の合計が実行されるため、明らかに意図したものではありません(重複している場合でも)。accn_demographicsaccn_idpdp.paid_amtp.copay_amt

accn_demographics最終的には、結合基準をさらに制限できるかどうかを確認してください(おそらく、ある日付までに)。そうすれば、結合中に重複する支払いレコードの数を制限できます。

于 2012-08-03T16:59:19.390 に答える