2017-03-03 24 views
1

異なるフィールド値を持つ2つのテーブルを結合することは可能でしょうか?私は(テキストに画像を変換するため@EdwardRusuにoriginal image、おかげで)MS SQL Server 2008のフィールド値が異なる2つのテーブルを結合する

表Aを使用しています:

+ ----- + --------- + -------- + ----------- + ------------------ + ---------------- + ----------- + 
| RecID | Member ID | LoanType | LoanSubType | Application Number | Application Date | Loan Amount | 
+ ----- + --------- + -------- + ----------- + ------------------ + ---------------- + ----------- + 
| 3  | 00005  | Regular |    | 201604002   | 2016-02-28  | 39864.00 | 
| 185 | 00005  | Special | Special ... | 201604183   | 2016-10-31  | 10000.00 | 
| 318 | 00005  | Regular |    | 201605063   | 2016-05-18  | 39864.00 | 
| 427 | 00005  | Regular |    | 201608021   | 2016-08-18  | 39872.00 | 
| 486 | 00005  | Special | Special ... | 201609044   | 2016-09-07  | 10000.00 | 
| 589 | 00005  | Regular |    | 201611008   | 2016-11-04  | 39872.00 | 
| 689 | 00005  | Regular |    | 201702004   | 2017-02-02  | 39872.00 | 
+ ----- + --------- + -------- + ----------- + ------------------ + ---------------- + ----------- + 

表B(original image):私はしたい

+ --------------- + --------- + ------ + ----- + ---------- + -------- + -------- + -------- + 
| ProjectAcctCode | Member ID | TMonth | TYear | TLastDate | TDebit | TCredit | TBalance | 
+ --------------- + --------- + ------ + ----- + ---------- + -------- + -------- + -------- + 
| 105350500  | 00005  | 1  | 2017 | 2017-01-31 | 0.00  | 2952.00 | -2952.00 | 
| 105350500  | 00005  | 5  | 2016 | 2016-05-31 | 73084.00 | 33220.00 | 39864.00 | 
| 105350500  | 00005  | 6  | 2016 | 2016-06-30 | 0.00  | 2951.42 | -2952.42 | 
| 105350500  | 00005  | 7  | 2016 | 2016-07-31 | 0.00  | 3014.14 | -3014.14 | 
| 105350500  | 00005  | 8  | 2016 | 2016-08-31 | 39872.00 | 33905.26 | 5973.55 | 
| 105350500  | 00005  | 9  | 2016 | 2016-09-30 | 0.00  | 2952.00 | -2952.00 | 
| 105350500  | 00005  | 10  | 2016 | 2016-10-31 | 0.00  | 3014.73 | -3014.73 | 
| 105350500  | 00005  | 11  | 2016 | 2016-11-30 | 39872.00 | 33905.26 | 5966.74 | 
| 105351000  | 00005  | 1  | 2017 | 2017-01-31 | 0.00  | 975.03 | -975.03 | 
| 105351000  | 00005  | 5  | 2016 | 2016-05-31 | 5000.00 | 1000.00 | 4000.00 | 
| 105351000  | 00005  | 6  | 2016 | 2016-06-30 | 0.00  | 1000.00 | -1000.00 | 
| 105351000  | 00005  | 7  | 2016 | 2016-07-31 | 0.00  | 1000.00 | -1000.00 | 
| 105351000  | 00005  | 8  | 2016 | 2016-08-31 | 0.00  | 1000.00 | -1000.00 | 
| 105351000  | 00005  | 9  | 2016 | 2016-09-30 | 10000.00 | 1000.00 | 9000.00 | 
| 105351000  | 00005  | 10  | 2016 | 2016-10-31 | 0.00  | 955.82 | -955.82 | 
| 105351000  | 00005  | 11  | 2016 | 2016-11-30 | 0.00  | 965.38 | -965.38 | 
+ --------------- + --------- + ------ + ----- + ---------- + -------- + -------- + -------- + 

をTableBからMemberID、LoanType、ApplicationNo、ApplicationDateでグループ化された合計TBalanceを取得します。これらの2つのテーブルは、LoanTypeとProjAcctCode AND ApplicationDateとTLastDateに基づいて結合する必要があります。 LoanTypeとProjActodeの値は異なります。しかし、 "REGULAR" Loantypeは "105350500" ProjActCodeに等しく、 "SPECIAL LoanType"は "105351000" ProjActctodeに相当します。 ApplicationDateはTLastDateより小さいか等しい必要があります。

+ -------- + -------- + ------------- + --------------- + ---------- + ------------ + --------- + --------- + 
| MemberID | LoanType | ApplicationNO | ApplicationDate | LoanAmount | ProjAcctCode | TLastDate | Balance | 
+ -------- + -------- + ------------- + --------------- + ---------- + ------------ + --------- + --------- + 
| 000005 | Regular | 201608021  | 8/18/2016  | 39,872.00 | 105350500 | 8/31/2016 | 39,871.44 | 
+ -------- + -------- + ------------- + --------------- + ---------- + ------------ + --------- + --------- + 

しかし、私のクエリで

SELECT a.MemberID, 
    (SELECT TOP (1) ApplicationNo 
     FROM TABLE A 
     WHERE (MemberID = a.MemberID) AND (ApplicationDate <= b.TLastDate) 
     ORDER BY ApplicationNo DESC) AS ApplicationNo, 
    (SELECT TOP (1) LoanAmount 
     FROM TABLE A AS SAL_APPLICATION_HEADER_1 
     WHERE (MemberID = a.MemberID) AND (ApplicationDate <= b.TLastDate) 
     ORDER BY ApplicationNo DESC) AS LoanAmount, 
    (SELECT TOP (1) ApplicationDate 
     FROM TABLE A AS SAL_APPLICATION_HEADER_2 
     WHERE (MemberID = a.MemberID) 
      AND (ApplicationDate <= b.TLastDate) 
     ORDER BY ApplicationNo DESC) AS ApplicationDate, 
    vwSAL_Balance_SL_1.ProjAcctCode, 
    b.TDebit, 
    b.TCredit, 
    b.TBalance AS Balance, 
    b.TLastDate 
    FROM TABLE A AS a 
    INNER JOIN TABLE B AS b ON a.MemberID = b.SLCode 
    GROUP BY a.MemberID, 
     b.TDebit, 
     b.TCredit, 
     b.TBalance, 
     b.ProjAcctCode, 
     b.TLastDate 
    HAVING (a.MemberID = N'00005') AND (b.TLastDate = '8/31/2016') 

私はこのような結果を得た:私は "REGULAR" ローンの種類のレコードを生成するかどう

だから、私はこのような何か(original image)を持っている必要があります(original image):

+ -------- + ------------- + ---------- + --------------- + ------------ + -------- + -------- + -------- + ---------- + 
| MemberID | ApplicationNo | LoanAmount | ApplicationDate | ProjAcctCode | TDebit | TCredit | Balance | TLastDate | 
+ -------- + ------------- + ---------- + --------------- + ------------ + -------- + -------- + -------- + ---------- + 
| 00005 | 201608021  | 39872.00 | 2016-08-18  | 105351000 | 0.00  | 1000.00 | -1000.00 | 2016-08-31 | 
| 00005 | 201608021  | 39872.00 | 2016-08-18  | 105350500 | 39872.00 | 33898.45 | 5973.55 | 2016-08-31 | 
+ -------- + ------------- + ---------- + --------------- + ------------ + -------- + -------- + -------- + ---------- + 

これが長すぎることがなく、時間を喜ばかもしれませんエル・P。ありがとうございました。

+3

pelase画像を投稿せず、DDL、DML投稿用に投稿してください – TheGameiswar

+1

上記に加えて、実際にコードを書いて読みやすくするように努力してください。 – KindaTechy

+0

あなたのお問い合わせは、テーブルBのSLコード。あなたのテーブルにそのフィールドを含めてください – KindaTechy

答えて

0

私は欲望の結果を得るために、私のクエリでUNION(per LoanType)を使用します。

0

tl; drはい、可能です。最後のクエリブロックは、あなたが望むものを与えます。

はい、フィールド値が異なる2つのテーブルを結合することは可能です。私はあなたが望むものを与える結合ステートメントの構築を通してあなたを歩みます。

2)マッチLoanTypeとProjAcctCode

3)日付


MEMBERIDとSLCode

を合わせ

1)マッチMEMBERIDとSLCode:次の3つのものが必要

あなたの上記のコメントに基づいて、私はth SLCodeはBのMemberIDと同じです。

select * 
    from A 
    inner join B 
     on B.MemberID = A.MemberID -- or B.SLCode = A.MemberID 


LoanTypeとProjAcctCode

この例では、あなたが、参加中のcase文を使用する

inner join B.ProjAcctCode = case A.LoanType when 'Regular' then 105350500 else 105351000 end 

ような何かをしたいこれがあればと言いますLoanTypeがRegularの場合、ProjAcctCode = 105350500のレコードのみを結合します。そうでなければ、ProjActCode 105351000を持つレコードに参加してください(ここでは、LoanTypeは2つの状態しかないので、特別なローンをキャプチャするためにelse節を使用すると完全に問題ありません。日付フィルタを取得

select * 
    from A 
    inner join B 
     on B.MemberID = A.MemberID 
     and B.ProjAcctCode = case A.LoanType when 'Regular' then 105350500 else 105351000 end 


日付

は右の即時です。

select * 
    from A 
    inner join B 
     on B.MemberID = A.MemberID 
     and B.ProjAcctCode = case A.LoanType when 'Regular' then 105350500 else 105351000 end 
     and A.ApplicationDate <= B.TLastDate 


グループと集計

今、あなたはテーブルが適切に参加していることを、あなただけのグループと集計する必要があります。それらのフィールドはあなたが望む集合体のために変化しないので、あなたはAからの何でもグループ化することができます。そして、あなたはBから来たものを選択する方法でちょっと巧妙でなければなりません。あなたの質問では、ProjAcctCode TLastDate(これは変更されるため、いくつかの基準で集計する必要があります)、TBalance(そこから合計が必要です)。 ApplicationNumber doesnの201702004とローン」:これは、次の表

+ -------- + -------- + ----------------- + --------------- + ------------ + ---------- + -------- + 
| MemberID | LoanType | ApplicationNumber | ApplicationDate | ProjAcctCode | TLastDate | TBalance | 
+ -------- + -------- + ----------------- + --------------- + ------------ + ---------- + -------- + 
| 00005 | Regular | 201604002   | 2016-02-08  | 105350500 | 2017-01-31 | 36913.19 | 
| 00005 | Special | 201604183   | 2016-10-31  | 105351000 | 2017-01-31 | -2896.23 | 
| 00005 | Regular | 201605063   | 2016-05-18  | 105350500 | 2017-01-31 | 36913.19 | 
| 00005 | Regular | 201608021   | 2016-08-18  | 105350500 | 2017-01-31 | 3014.75 | 
| 00005 | Special | 201609044   | 2016-09-07  | 105351000 | 2017-01-31 | 6103.77 | 
| 00005 | Regular | 201611008   | 2016-11-04  | 105350500 | 2017-01-31 | 3014.74 | 
+ -------- + -------- + ----------------- + --------------- + ------------ + ---------- + -------- + 

を生成何か

select A.MemberID, 
     A.LoanType, 
     A.ApplicationNumber, 
     A.ApplicationDate, 
     [anything else you want from A], 
     B.ProjAcctCode -- aggregate not needed because this doesn't change 
     max(B.TLastDate) as TLastDate, 
     sum(B.TBalance) as TBalance 
    from A 
    inner join B 
     on B.MemberID = A.MemberID 
     and B.ProjAcctCode = case A.LoanType when 'Regular' then 105350500 else 105351000 end 
     and A.ApplicationDate <= B.TLastDate 
    group by A.MemberID, 
     A.LoanType, 
     A.ApplicationNumber, 
     A.ApplicationDate, 
     [anything else you selected from A], 
     B.ProjAcctCode 

のようなクエリが可能になるので、私は、あなたが最新のTLastDateをしたいと仮定するつもりですそれは日付によってフィルタリングされるので(すなわち、その適用日がBのすべてのTLastDateより大きい)、最終結果に現れません。

+0

ありがとうございます。私は欲望の結果を得るために、クエリでUNION(per LoanType)を使用します。 – angel

関連する問題