2017-10-06 10 views
0

トランザクションテーブルを持つ約4MM行のアカウントマスタテーブルに参加しています。私の問題は、私がアカウントテーブルのアカウント番号をトランザクションテーブル=アカウント番号から左のジョインをすると、私は私たちのデータの異常を発見しているということです。同じ口座番号の口座マスタに3つの異なるエントリを持つことができます。これらはアカウントの特性に関連しています。異常は、住所情報が同じである場合があるが、場合によっては、市のスペルが違うことを見ていることである。 2つのテーブルを結合すると、私はアカウントマスタのアカウント番号の最初のインスタンスのみが必要になります。私はrow_number()を使用していくつかの記事を見てきましたが、私はここでそれを正しく使用することに迷っています。これは私が使用しているが、各口座番号の3つのレコードを取得しています。右テーブルトップ1の値で左結合

 select am.[Customer_Name], am.[svc_city], sr.measure 
from [dbo].[PP_SUMMARY_RESIDENTIAL] sr 
left join [CIS].[dbo].[Account_Master] am on 
(case when (left(sr.fred_account_number,2) = '00') then (right(sr.fred_account_number,len(sr.fred_account_number - 2))) 
    when (left(sr.fred_account_number,1) = '0') then (right(sr.fred_account_number,len(sr.fred_account_number - 1))) 
    else sr.fred_account_number 
    end) 
= (select am.accountnumber, row_number() over (order by am.accountnumber) as row) where row = 1 
and sr.fred_account_number = '123456789' 
+0

ここから始めましょう。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

答えて

0

まず第一に、同じアカウントの複数のレコードがある場合は、DBスキーマおよび/またはそれを使用するアプリケーションは、改修を必要としています。とにかく

、あなたは(あなたのクエリから簡体字)の線に沿って何かを行うことができますいくつかの「類似」の1つのレコードのみ

with 
acc_with_ord as ( 
    select 
     col1, col2,..., 
     row_number() over (partition by <uniquely identifying columns> order by <some columns>) as ord 
    from 
     AccountMaster 
), 
unq_acc as (
    select * from acc_with_ord where ord = 1 

) 
select <something> 
from 
    pp_summary_residential 
    left join unq_acc on 
     <join conditions> 

を選択するために、最初の部分は同じことを記述したレコードにサロゲートオーダーIDを割り当て、 (アカウントを一意に識別するいくつかのフィールドで分割するため)、2つ目はアカウントごとに1つのレコードのみを選択し、3つ目は結合の一意のアカウントレコードを使用する最後の選択です。

0

私はouter applyを使用することをお勧めし:これはorder byに依存する1、amから1行を選択します

select am.[Customer_Name], am.[svc_city], sr.measure 
from [dbo].[PP_SUMMARY_RESIDENTIAL] sr outer apply 
    (select top 1 am.* 
     from [CIS].[dbo].[Account_Master] am 
     where (case when (left(sr.fred_account_number, 2) = '00') then (right(sr.fred_account_number,len(sr.fred_account_number - 2))) 
        when (left(sr.fred_account_number,1) = '0') then (right(sr.fred_account_number, len(sr.fred_account_number - 1))) 
        else sr.fred_account_number 
      end) 
     order by am.account_number 
    ) am; 

関連する問題