2016-09-30 9 views
1

が、私は、複数の基準に基づいて、2つのテーブルを結合しようとしています(月()関数を使用して)参加か​​ら1試合を返します:ポリシー番号、日付のトランザクション・タイプ、日付の年、月SQL Serverの:左

ポリシーの大半はこのコードで正常に動作しますが、結合条件を満たす複数行のデータがあるため、select文に重複する行が返されることがあります。

戻ってくるもの(最古の日付、最初の一致など)を選択する最良の方法はありません。実際にはコードが1行のデータ(重複なし)のみを返すようにします。

ご意見、ご協力をお待ちしております。

select 
a.POLICY_NUMBER, 
a.POLICY_TRANSACTION_TYPE, 
a.POLICY_START_DATE, 
b.COMMISSION_RATE, 
from Table_1 as a 
left join Table_2 as b 
on 
    a.POLICY_NUMBER = b.POLICY_NUMBER 
    and a.POLICY_TRANSACTION_TYPE = b.TRANSACTION_TYPE 
    and year(a.POLICY_START_DATE) = year(b.EFFECTIVE_DATE) 
    and month(a.POLICY_START_DATE) = month(b.EFFECTIVE_DATE) 

EDIT

サンプルTABLE_1

POLICY_NUMBER POLICY_TRANSACTION_TYPE POLICY_YEAR_START_DATE 
1    REN      1/1/2016 
1    MTA      15/1/2016 

サンプルTable_2

POLICY_NUMBER TRANSACTION_TYPE EFFECTIVE_DATE COMMISSION_RATE 
1    REN    1/1/2016  0.3 
1    MTA    14/1/2016  0.1 
1    MTA    16/1/2016  -0.1 

だから、元のコードは、この...

を返します0
POLICY_NUMBER POLICY_TRANSACTION_TYPE POLICY_YEAR_START_DATE COMMISSION_RATE 
1    REN      1/1/2016    0.3 
1    MTA      15/1/2016    0.1 
1    MTA      15/1/2016    -0.1 

MTAの行のうちの1つを返したいのですが、それは0.1手数料率でも、-0.1手数料率でも構いません。

+0

使用しているデータベースであなたの質問にタグを付けます。 –

+0

おそらく別名は重複を削除するでしょうか? – mfredy

答えて

0

サンプルデータと結果がなく、少し曖昧です。重複がtable2から来ていると仮定します。あなたは、任意row_number()を使用していずれかを選択できます。

from Table_1 a left join 
    (select b.*, 
      row_number() over (partition by POLICY_NUMBER, TRANSACTION_TYPE, year(EFFECTIVE_DATE), month(EFFECTIVE_DATE) 
           order by TRANSACTION_TYPE -- this will be an arbitrary ordering 
           ) as seqnum 
     from Table_2 b 
    ) b 
    on a.POLICY_NUMBER = b.POLICY_NUMBER and 
     a.POLICY_TRANSACTION_TYPE = b.TRANSACTION_TYPE and 
     year(a.POLICY_START_DATE) = year(b.EFFECTIVE_DATE) and 
     month(a.POLICY_START_DATE) = month(b.EFFECTIVE_DATE) 
0
select a.POLICY_NUMBER, 
     a.POLICY_TRANSACTION_TYPE, 
     a.POLICY_START_DATE, 
     MAX(b.COMMISSION_RATE) 
from Table_1 as a 
left join Table_2 as b 
    on a.POLICY_NUMBER = b.POLICY_NUMBER and 
     a.POLICY_TRANSACTION_TYPE = b.TRANSACTION_TYPE and 
     year(a.POLICY_START_DATE) = year(b.EFFECTIVE_DATE) and 
     month(a.POLICY_START_DATE) = month(b.EFFECTIVE_DATE) 

group by a.POLICY_NUMBER, 
     a.POLICY_TRANSACTION_TYPE, 
     a.POLICY_START_DATE 
関連する問題