繁体   English   中英

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM