2016-05-29 19 views
0

私はこれらの2つのテーブルを持っています:2つのテーブルのSQL合計

私は割引テーブルで支払いテーブルに参加する必要があります。割引テーブルには支払日がないため、期待される出力は不可能と思われます。私は、私は両方のテーブルに共通の列がPERSON_IDさ見ての通り、あなたがそれに参加しようとすることができますnet_amountに

payment table: 
id | net_amount | payment_dt | person_id 
1001 | 2765.36  | 2016-05-28 | 372 
1002 | 2474.76  | 2016-05-29 | 372 
1003 | 22694.25 | 2016-05-29 | 384 
1004 | 1911.92  | 2016-05-29 | 384 

discounts table: 
id | person_id | gross_amount | sc_discount | other_discount_amount | other_discount_type 
1 | 372  | 3566.7  | 713.34  | 88.00     | MISC 
2 | 372  | 3202.2  | 640.44  | 87.00     | PAT 
3 | 384  | 3566.7  | 713.34  | 285.34    | MISC 
4 | 384  | 27953.10  | 5590.62  | 2236.25    | PAT 
5 | 384  | 2655.45  | 531.09  | 212.44    | MISC 

*1 - payment_dt is 2016-05-28 

expected output: (where payment_dt=2016-05-29) 
total_gross_amount | total_sc_discount | total_misc_discount | total_pat_discount | total_net_amount 
37,377.45   | 7475.49   | 497.78    | 2,323.25   | 27,080.93 
+0

2つのテーブルのレコード間に論理的なリンクがない場合は、結果を得ることができません。あなたは毎日がダイアルテーブルのレコードが1つしかなく、今日は継続しているということをgurennteeが知っているならば、今日の割引は昨日の最高IDです。higestidから1を引いたものです。ケースが特定であり、非常に危険な状況にある場合などです。 – SMW

+0

あなたのスキーマをもう少し説明できますか? Q1:支払いテーブルの「id」が繰り返し表示されるのはなぜですか? Q2:なぜ4つの支払いエントリがありますが、5つの割引エントリがあるのですか?それは1-1マッピングですか? Q3:net_amount = gross_amountですか?sc_discount - other_discount_amountですか? – greperror

+0

***これらの2つのテーブルの間の関係は***かもしれません。割引1は、支払いテーブルの最初の行に一致する '3566.70 - 713.34 - 88.00 = 2765.36'を持ちます。ディスカウント2とディスカウント5で同じことができます。ただしディスカウント3には、一致する支払い行がありません。割引4 *が最大の支払いに関連して表示されますが、数字は加算されません。あなたは、割引への支払いや、少なくとも重要な分野への支払いをリンクする*テーブル全体(またはテーブル)*が不足しているように見えます。 – MatBailie

答えて

0

を得ることができます。詳細については、自然な結合を覚えておいてください。

"NATURAL JOINは、2つのテーブルの共通の列に基づいて暗黙的な結合節を作成するJOIN操作ですNATURAL JOINはINNER結合、LEFT OUTER結合、またはRIGHT OUTER結合のいずれかです。デフォルトはINNER結合です。デフォルトはINNER結合です。 "

+0

2つのテーブルに同じ列が含まれていないということは、disputed putのためにリンクすることができるということです。お客様は、何日も何度も多くの購入をすることができます。購入Aが割引Xまたは割引Yにリンクしているかどうかはどのように分かりますか?お客様のロジックは、顧客が購入を1つしか持てない場合にのみ機能します。 – SMW

+0

お客様は多くの購入をしている可能性がありますが、テーブル上のデータを介して、それらの間の唯一のリンクはperosn_idであり、必要なもの、すべての支払いの割引額、割引タイプ、および支払日を取得します。そして、支払いのための質問i:payment_dtは2016-05-28です – fstafai

+0

@fstafai OPに与えられたデータによると... 'person_id' 372には2つの支払い記録があります。 「2016-05-28」と「2016-05-29」。彼はまた、割引の2つの記録を持っています。どの割引がどの注文と関連しているかをどのように知っていますか? – Elad

0

仮定すると: net_amount =総額 - sc_discount - other_discount_amount

予想される出力のtotal_net_amountの支払いテーブルに行く必要はありません

あなたはこのようにそれを書き込むことができます。

Select sum(gross_amount) as total_gross_amount, 
sum(sc_discount) as total_sc_discount, 
sum(gross_amount - sc_discount - other_discount_amount) as total_net_amount 
sum(CASE other_discount_type when 'MISC' THEN other_discount_amount WHEN 'PAT' THEN 0) as total_misc_discount, 
sum(CASE other_discount_type when 'MISC' THEN 0 WHEN 'PAT' THEN other_discount_amount) as total_pat_discount  
from discounts 

そして場合に上記の仮定は、集計が完了すると、1行のみが出力に来る、事実ではない、あなたはのようにtotal_net_amount以外のすべての列を取得することができます上記のクエリでは、支払いテーブルからsum(net_amount)を取得し、それらを1,1行だけで真に結合します。

関連する問題