SQL连接两个表,其中一列根据另一个字段转到两个不同的字段

时间:2017-02-03 00:08:28

标签: sql

我有两张桌子缩小到所需的字段,做我需要的。

矿床

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

我开始简化了表格。我添加了解决方案所需的一些列。

3 个答案:

答案 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       ║
    ╚═══════╩════════════╩═════════════╩═════════╩════════════╩════════════╝