我有两张桌子缩小到所需的字段,做我需要的。
矿床
css
批次
╔═════════════╦════════════╦══════════════╦═════════╦════════════╗
║ 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 ║
╚═════════════╩════════════╩══════════════╩═════════╩════════════╝
我想在DepositDate和BatchDate上加入这两个表。当第一个表上的IsChargeback为1时,我需要将Gross列作为新表中的调整,其中Gross为0.当天的最后DailyTotal需要与总总数的总和相匹配。这是预期的输出:
SeqNo :输出中没有重复
BatchDate :应该与批量中的 SeqNo 匹配
BatchNumber :应与输出中批次的 SeqNo 匹配
总:如果 IsChargeback 为1则为0,否则 Gross 来自批次
第三方:如果 IsChargeback 为1则为0,否则来自存款的 ThirdParty
调整:如果 IsChargeback 为0则为0,否则 Gross 来自批次
我正在寻找
╔═══════╦════════════╦═════════════╦═════════╗
║ 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 ║
╚═══════╩════════════╩═════════════╩═════════╝
我尝试过的事情
我当前查询的问题是我得到的行多于我想要的两行,因为我需要一个顶部而另一个底部,我无法通过一个组修复它。这是我的查询和输出。
╔═══════╦════════════╦═════════════╦═════════╦════════════╦═════════════╗
║ 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 ║
╚═══════╩════════════╩═════════════╩═════════╩════════════╩═════════════╝
最好的方法是什么?
更新
我尝试了第一条评论,但结果与我正在寻找的内容并不匹配。
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 ║
╚═══════╩════════════╩═════════════╩═════════╩════════════╩═════════════╝
更新2
我开始简化了表格。我添加了解决方案所需的一些列。
答案 0 :(得分:0)
我认为可以使用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;
我从IsChargeback
删除了SELECT
。它没有意义,因为它在一个组中有多个值,无论如何都是以一种方式转动值。
答案 1 :(得分:0)
对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
答案 2 :(得分:0)
在加入之前,将Gross字段拆分为Gross并根据IsChargeback进行调整,以便我找到答案。
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 ║
╚═══════╩════════════╩═════════════╩═════════╩════════════╩════════════╝