![](/img/trans.png)
[英]Select records based on two tables where one column in one table starts with the records from another tables column using SQL
[英]SQL Join two tables where one column goes to two different fields based on another field
我有两个表减少到所需的字段来做我所需要的。
存款
╔═════════════╦════════════╦══════════════╦═════════╦════════════╗
║ DepositDate ║ ThirdParty ║ IsChargeback ║ Gross ║ DailyTotal ║
╠═════════════╬════════════╬══════════════╬═════════╬════════════╣
║ 2016-07-26 ║ 1000.65 ║ 0 ║ 5653.84 ║ 5653.84 ║
╠═════════════╬════════════╬══════════════╬═════════╬════════════╣
║ 2016-07-27 ║ 625.54 ║ 0 ║ 5438.98 ║ NULL ║
╠═════════════╬════════════╬══════════════╬═════════╬════════════╣
║ 2016-07-27 ║ 0.00 ║ 1 ║ 394.39 ║ 5833.37 ║
╠═════════════╬════════════╬══════════════╬═════════╬════════════╣
║ 2016-07-28 ║ 0.00 ║ 0 ║ 2006.52 ║ 2006.52 ║
╚═════════════╩════════════╩══════════════╩═════════╩════════════╝
分批
╔═══════╦════════════╦═════════════╦═════════╗
║ SeqNo ║ BatchDate ║ BatchNumber ║ Gross ║
╠═══════╬════════════╬═════════════╬═════════╣
║ 26 ║ 2016-07-26 ║ 98020841003 ║ 5653.84 ║
╠═══════╬════════════╬═════════════╬═════════╣
║ 27 ║ 2016-07-27 ║ 072716MOADJ ║ 394.39 ║
╠═══════╬════════════╬═════════════╬═════════╣
║ 28 ║ 2016-07-27 ║ 98020941003 ║ 5438.98 ║
╠═══════╬════════════╬═════════════╬═════════╣
║ 29 ║ 2016-07-28 ║ 98021041003 ║ 2006.52 ║
╚═══════╩════════════╩═════════════╩═════════╝
我想在DepositDate和BatchDate上加入这两个表。 当第一个表的IsChargeback为1时,我需要在新表中将Gross列设置为Adjustments并将Gross设置为0。一天的最后一个DailyTotal必须与Gross总计的总和匹配。 这是预期的输出:
SeqNo :输出中没有重复项
BatchDate :应匹配输出中批次的 SeqNo
BatchNumber :应匹配输出中批次的 SeqNo
毛额 :如果IsChargeback为1, 则为 0,否则为批次的 毛额
第三方 :如果IsChargeback为1, 则为 0,否则为存款中的 ThirdParty
调整 :如果IsChargeback为0, 则为 0,否则为批次的 毛额
我在寻找什么
╔═══════╦════════════╦═════════════╦═════════╦════════════╦═════════════╗
║ SeqNo ║ BatchDate ║ BatchNumber ║ Gross ║ ThirdParty ║ Adjustments ║
╠═══════╬════════════╬═════════════╬═════════╬════════════╬═════════════╣
║ 26 ║ 2016-07-26 ║ 98020841003 ║ 5653.84 ║ 1000.65 ║ 0.00 ║
╠═══════╬════════════╬═════════════╬═════════╬════════════╬═════════════╣
║ 27 ║ 2016-07-27 ║ 072716MOADJ ║ 0.00 ║ 0.00 ║ 394.39 ║
╠═══════╬════════════╬═════════════╬═════════╬════════════╬═════════════╣
║ 28 ║ 2016-07-27 ║ 98020941003 ║ 5438.98 ║ 625.54 ║ 0.00 ║
╠═══════╬════════════╬═════════════╬═════════╬════════════╬═════════════╣
║ 29 ║ 2016-07-28 ║ 98021041003 ║ 2006.52 ║ 0.00 ║ 0.00 ║
╚═══════╩════════════╩═════════════╩═════════╩════════════╩═════════════╝
我尝试过的
当前查询的问题是,我得到的行比我想要的多两行,并且由于我需要一个行的顶部和另一个行的底部,因此无法使用group by进行修复。 这是我的查询和输出。
SELECT
SeqNo,
BatchDate,
BatchNumber,
CASE IsChargeback WHEN 1 THEN 0 ELSE Gross END AS Gross,
CASE IsChargeback WHEN 1 THEN 0 ELSE ThirdParty END AS ThirdParty,
CASE IsChargeback WHEN 0 THEN 0 ELSE Gross END AS Adjustments,
IsChargeback
FROM Batches
Join Deposits
ON Batches.BatchDate = Deposits.DepositDate
╔═══════╦════════════╦═════════════╦═════════╦════════════╦═════════════╗
║ SeqNo ║ BatchDate ║ BatchNumber ║ Gross ║ ThirdParty ║ Adjustments ║
╠═══════╬════════════╬═════════════╬═════════╬════════════╬═════════════╣
║ 26 ║ 2016-07-26 ║ 98020841003 ║ 5653.84 ║ 1000.65 ║ 0.00 ║
╠═══════╬════════════╬═════════════╬═════════╬════════════╬═════════════╣
║ 27 ║ 2016-07-27 ║ 072716MOADJ ║ 394.39 ║ 625.54 ║ 0.00 ║
╠═══════╬════════════╬═════════════╬═════════╬════════════╬═════════════╣
║ 27 ║ 2016-07-27 ║ 072716MOADJ ║ 0.00 ║ 0.00 ║ 394.39 ║
╠═══════╬════════════╬═════════════╬═════════╬════════════╬═════════════╣
║ 28 ║ 2016-07-27 ║ 98020941003 ║ 5438.98 ║ 625.54 ║ 0.00 ║
╠═══════╬════════════╬═════════════╬═════════╬════════════╬═════════════╣
║ 28 ║ 2016-07-27 ║ 98020941003 ║ 0.00 ║ 0.00 ║ 5438.98 ║
╠═══════╬════════════╬═════════════╬═════════╬════════════╬═════════════╣
║ 29 ║ 2016-07-28 ║ 98021041003 ║ 2006.52 ║ 0.00 ║ 0.00 ║
╚═══════╩════════════╩═════════════╩═════════╩════════════╩═════════════╝
最好的方法是什么?
更新资料
我尝试了第一条评论,但结果与我想要的结果不符。
SELECT SeqNo, BatchDate, BatchNumber,
MAX(CASE IsChargeback WHEN 1 THEN 0 ELSE Gross END) AS Gross,
MAX(CASE IsChargeback WHEN 1 THEN 0 ELSE ThirdParty END) AS ThirdParty,
MAX(CASE IsChargeback WHEN 0 THEN 0 ELSE Gross END) AS Adjustments
FROM [Batches] b JOIN
Deposits d
ON b.BatchDate = d.DepositDate
GROUP BY b.SeqNo, b.BatchDate, b.BatchNumber
╔═══════╦════════════╦═════════════╦═════════╦════════════╦═════════════╗
║ SeqNo ║ BatchDate ║ BatchNumber ║ Gross ║ ThirdParty ║ Adjustments ║
╠═══════╬════════════╬═════════════╬═════════╬════════════╬═════════════╣
║ 26 ║ 2016-07-26 ║ 98020841003 ║ 5653.84 ║ 1000.65 ║ 0.00 ║
╠═══════╬════════════╬═════════════╬═════════╬════════════╬═════════════╣
║ 27 ║ 2016-07-27 ║ 072716MOADJ ║ 394.39 ║ 625.54 ║ 394.39 ║
╠═══════╬════════════╬═════════════╬═════════╬════════════╬═════════════╣
║ 28 ║ 2016-07-27 ║ 98020941003 ║ 5438.98 ║ 625.54 ║ 5438.98 ║
╠═══════╬════════════╬═════════════╬═════════╬════════════╬═════════════╣
║ 29 ║ 2016-07-28 ║ 98021041003 ║ 2006.52 ║ 0.00 ║ 0.00 ║
╚═══════╩════════════╩═════════════╩═════════╩════════════╩═════════════╝
更新2
我简化了太多表格,以至于无法开始。 我添加了解决方案所需的一些列。
我认为您可以通过group by
来解决此问题:
SELECT SeqNo, BatchDate, BatchNumber,
MAX(CASE WHEN IsChargeback = 0 THEN Gross END) AS Gross,
MAX(CASE WHEN IsChargeback = 0 THEN ThirdParty END) AS ThirdParty,
MAX(CASE WHEN IsChargeback = 1 THEN Gross END) AS Adjustments
FROM Batches b LEFT JOIN
Deposits d
ON b.BatchDate = d.DepositDate;
我从SELECT
删除了IsChargeback
。 这是没有意义的,因为它在一个组中有多个值,并且无论如何这些值都被旋转。
戈登·利诺夫(Gordon Linoff)的较小改动应满足您的要求:
SELECT SeqNo, BatchDate, BatchNumber,
MIN(CASE WHEN IsChargeback = 1 THEN 0 ELSE Gross END) AS Gross,
MIN(CASE WHEN IsChargeback = 1 THEN 0 ELSE ThirdParty END) AS ThirdParty,
MAX(CASE WHEN IsChargeback = 1 THEN Gross ELSE 0 END) AS Adjustments
FROM Batches b LEFT JOIN
Deposits d
ON b.BatchDate = d.DepositDate
group by SeqNo, BatchDate, BatchNumber
在加入前将Gross字段分为IsChargeback和Gross调整,然后将我引向答案。
SELECT
SeqNo,
BatchDate,
BatchNumber,
d.Gross,
ThirdParty,
Adjustment
FROM [Batches] b Join (
SELECT
DepositDate,
CASE WHEN IsChargeback = 0 THEN Gross ELSE 0 END AS Gross,
ThirdParty,
CASE WHEN IsChargeback = 1 THEN Gross ELSE 0 END AS Adjustment
FROM Deposits
) as d
ON b.BatchDate = d.DepositDate AND (b.Gross = d.Gross OR b.Gross = Adjustment)
ORDER BY SeqNo
╔═══════╦════════════╦═════════════╦═════════╦════════════╦════════════╗
║ SeqNo ║ BatchDate ║ BatchNumber ║ Gross ║ ThirdParty ║ Adjustment ║
╠═══════╬════════════╬═════════════╬═════════╬════════════╬════════════╣
║ 26 ║ 2016-07-26 ║ 98020841003 ║ 5653.84 ║ 1000.65 ║ 0.00 ║
╠═══════╬════════════╬═════════════╬═════════╬════════════╬════════════╣
║ 27 ║ 2016-07-27 ║ 072716MOADJ ║ 0.00 ║ 0.00 ║ 394.39 ║
╠═══════╬════════════╬═════════════╬═════════╬════════════╬════════════╣
║ 28 ║ 2016-07-27 ║ 98020941003 ║ 5438.98 ║ 625.54 ║ 0.00 ║
╠═══════╬════════════╬═════════════╬═════════╬════════════╬════════════╣
║ 29 ║ 2016-07-28 ║ 98021041003 ║ 2006.52 ║ 0.00 ║ 0.00 ║
╚═══════╩════════════╩═════════════╩═════════╩════════════╩════════════╝
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.