Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 用不同的字段值联接两个表_Sql Server_Sql Server 2008_Inner Join - Fatal编程技术网

Sql server 用不同的字段值联接两个表

Sql server 用不同的字段值联接两个表,sql-server,sql-server-2008,inner-join,Sql Server,Sql Server 2008,Inner Join,可以用不同的字段值连接两个表吗?我正在使用MS SQL Server 2008 表A(,感谢@EdwardRusu将图像转换为文本): 表B(): 我想从表B中获得按MemberID、LoanType、ApplicationNo、ApplicationDate分组的总余额。这两个表应该基于LoanType和projactcode以及ApplicationDate和TLastDate进行连接。LoanType和projactcode具有不同的值。但是,“常规”贷款类型等于“105350500”项目

可以用不同的字段值连接两个表吗?我正在使用MS SQL Server 2008

表A(,感谢@EdwardRusu将图像转换为文本):

表B():

我想从表B中获得按MemberID、LoanType、ApplicationNo、ApplicationDate分组的总余额。这两个表应该基于LoanType和projactcode以及ApplicationDate和TLastDate进行连接。LoanType和projactcode具有不同的值。但是,“常规”贷款类型等于“105350500”项目代码,“特殊贷款类型”等于“105351000”项目代码。 ApplicationDate应小于或等于TLastDate

因此,如果我要为“常规”贷款类型生成记录,我应该有如下内容():

但我的问题是

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')

这可能太长了,但请帮忙。谢谢。

tl;dr是的,这是可能的。最后的查询块将为您提供所需的内容

是的,只要知道两个表之间的某种关联,就可以使用不同的字段值连接两个表。我将引导您完成join语句的构造,它为您提供了所需的内容。你需要三件事:

1) 匹配MemberID和SLCode

2) 匹配LoanType和projactcode

3) 匹配日期


成员ID和SLCode

根据您上面的评论,我将假设SLCode与B中的MemberID是相同的

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

贷款类型和项目代码

在本例中,您希望在联接中使用case语句,例如

inner join B.ProjAcctCode = case A.LoanType when 'Regular' then 105350500 else 105351000 end
这意味着,如果LoanType是正则的,那么只加入ProjAcctCode=105350500的记录;否则,请连接项目代码为105351000的记录。(这里,LoanType只有两个状态,因此使用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
        and A.ApplicationDate <= B.TLastDate

注:申请编号为201702004的贷款不会出现在最终结果中,因为它会按日期过滤掉(即其申请日期大于B中的所有TLastDate)。

tl;dr是的,这是可能的。最后的查询块将为您提供所需的内容

是的,只要知道两个表之间的某种关联,就可以使用不同的字段值连接两个表。我将引导您完成join语句的构造,它为您提供了所需的内容。你需要三件事:

1) 匹配MemberID和SLCode

2) 匹配LoanType和projactcode

3) 匹配日期


成员ID和SLCode

根据您上面的评论,我将假设SLCode与B中的MemberID是相同的

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

贷款类型和项目代码

在本例中,您希望在联接中使用case语句,例如

inner join B.ProjAcctCode = case A.LoanType when 'Regular' then 105350500 else 105351000 end
这意味着,如果LoanType是正则的,那么只加入ProjAcctCode=105350500的记录;否则,请连接项目代码为105351000的记录。(这里,LoanType只有两个状态,因此使用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
        and A.ApplicationDate <= B.TLastDate

注意:申请号为201702004的贷款不会出现在最终结果中,因为它会按日期过滤掉(即其申请日期大于B中的所有TLastDate)。

我只是在查询中使用UNION(每个贷款类型)来获得所需的结果

我只是在查询中使用UNION(每个LoanType)来获得所需的结果

考虑不要张贴图像,并努力为DDRL、DML添加RePrin,除了上面的内容外,请努力格式化您的代码,这样您的查询就可以从表B中引用一个字段,称为SL代码。请将该字段包括在您的tables@EdwardRusu谢谢您格式化代码。@ EdwardRusu,SL代码相当于成员ID,或者表与成员ID和SL代码连接。Palase考虑不张贴图像,并努力在上面添加DDL,DML用于RePROIN,请努力实际格式化代码,使其可读。您的查询引用表B中名为SL代码的字段。请将该字段包括在您的tables@EdwardRusu,感谢您格式化代码。@EdwardRusu,SL代码等同于成员ID,或者该表已与成员ID和SL代码联接。谢谢。我只是在我的查询中使用UNION(perloantype)来获得所需的结果。谢谢。我只是在查询中使用UNION(per LoanType)来获得所需的结果。
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
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
+ -------- + -------- + ----------------- + --------------- + ------------ + ---------- + -------- +
| 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  |
+ -------- + -------- + ----------------- + --------------- + ------------ + ---------- + -------- +