Sql server 用不同的字段值联接两个表
可以用不同的字段值连接两个表吗?我正在使用MS SQL Server 2008 表A(,感谢@EdwardRusu将图像转换为文本): 表B(): 我想从表B中获得按MemberID、LoanType、ApplicationNo、ApplicationDate分组的总余额。这两个表应该基于LoanType和projactcode以及ApplicationDate和TLastDate进行连接。LoanType和projactcode具有不同的值。但是,“常规”贷款类型等于“105350500”项目代码,“特殊贷款类型”等于“105351000”项目代码。 ApplicationDate应小于或等于TLastDate 因此,如果我要为“常规”贷款类型生成记录,我应该有如下内容(): 但我的问题是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”项目
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 |
+ -------- + -------- + ----------------- + --------------- + ------------ + ---------- + -------- +