-1

2 つのテーブルを結合して合計を取得すると、正しい数値が得られます。

select 
    d.accn_id,
    cast(d.load_date as DATE) as LoadDate,
    cast (d.final_rpt_date as DATE) as FinalReportDate,
    sum(p.paid_amt) as SumPaidAmt

from
    accn_demographics d
join 
    accn_payments p
on 
    d.ACCN_ID=p.ACCN_ID
where 
    p.POSTED='y'
    and p.PMT_DATE between '20120501' and '20120531'

group by 
    d.accn_id,
    d.load_date,
    d.final_rpt_date

ただし、別のテーブルaccn_payorsに参加した後:

select 
    d.accn_id,
    cast(d.load_date as DATE) as LoadDate,
    cast (d.final_rpt_date as DATE) as FinalReportDate,
    sum(p.paid_amt) as SumPaidAmt
    ,payors.PAYOR_ID
from
    accn_demographics d
join 
    accn_payments p
on 
    d.ACCN_ID=p.ACCN_ID
left join 
    accn_payors payors
on  
    payors.X_PAYOR_ID=p.X_PRICED_PAYOR_ID 
    and payors.ACCN_ID = p.ACCN_ID
where 
    p.POSTED='y'
    and p.PMT_DATE between '20120501' and '20120531'

group by 
    d.accn_id,
    d.load_date,
    d.final_rpt_date
    ,payors.PAYOR_ID

私は誇張されていますsum(p.paid_amt)

問題は、複数回参加しないように参加を調整するにはどうすればよいですか?

4

2 に答える 2

1

これはうまくいくかもしれませんが、どの payor_id を取得したいかを決定するものがわからないので、min() は適切な関数ではないかもしれません。おそらく max() でしょうか?

SELECT * 

FROM (

select 
    d.accn_id,
    cast(d.load_date as DATE) as LoadDate,
    cast (d.final_rpt_date as DATE) as FinalReportDate,
    sum(p.paid_amt) as SumPaidAmt,
    min(p.X_PRICED_PAYOR_ID)


from
    accn_demographics d
join 
    accn_payments p
on 
    d.ACCN_ID=p.ACCN_ID
where 
    p.POSTED='y'
    and p.PMT_DATE between '20120501' and '20120531'

group by 
    d.accn_id,
    d.load_date,
    d.final_rpt_date
) payments
LEFT JOIN accn_payors payors
on  
    payors.X_PAYOR_ID=payments.X_PRICED_PAYOR_ID 
    and payors.ACCN_ID = payments.ACCN_ID
于 2012-08-20T23:53:52.340 に答える
1

accn_payors で結合する代わりに、accn_id ごとに 1 行を返す SELECT ステートメントで結合する必要があります。要件によっては、これでうまくいく場合があります。

select accn_id, min(x_payor_id) x_payor_id
from payors
group by accn_id

同じ名前でエイリアスmin(x_payor_id)を作成すると、コードの残りの部分を変更せずに機能させることができます。それは良い考えかもしれませんし、そうでないかもしれません。少し誤解を招きやすいです。

だから、これの代わりに。. .

left join 
    accn_payors payors
on  
    payors.X_PAYOR_ID=p.X_PRICED_PAYOR_ID 
    and payors.ACCN_ID = p.ACCN_ID

あなたはこれをするでしょう。. .

left join 
    (select accn_id, min(x_payor_id)
     from payors
     group by accn_id) payors
on  
    payors.x_payor_id = p.x_priced_payor_id
    and payors.accn_id = p.accn_id
于 2012-08-20T23:55:07.350 に答える