【问题标题】:SQL merge sum selects to one resultSQL 合并总和选择一个结果
【发布时间】:2018-06-20 23:43:38
【问题描述】:

我对同一个表有 2 个选择查询,它们都在选择部分中只包含一个 sum(),但在 where 子句中有所不同。我需要做的是将两个查询的结果相加。

查询示例:

SELECT SUM(amount) 
FROM EXAMPLETABLE
WHERE  IDATE BETWEEN '2017/01/01' AND '2017/12/31' AND SOMESTATUS = 0

SELECT SUM(otherAmount) 
FROM EXAMPLETABLE
WHERE  IDATE BETWEEN '2018/01/01' AND '2018/12/31' AND SOMESTATUS = 1

我需要的是类似

SELECT SUM(amount+otherAmount)
FROM EXAMPLETABLE

amountotherAmount 在我的示例查询中被选中。

我尝试关注this question,但无法正常工作。我还尝试用sub-select 替换字段,但这不起作用,因为selects 不允许在aggregate function 中使用

【问题讨论】:

  • MS SQL,将添加为标签

标签: sql sql-server select subquery aggregate-functions


【解决方案1】:

我认为你可以在 SQL Server 中编写此代码

SELECT
( SELECT SUM(amount) a FROM EXAMPLETABLE WHERE IDATE BETWEEN '2017/01/01' AND '2017/12/31' AND SOMESTATUS = 0 )
+
( SELECT SUM(otherAmount) a FROM EXAMPLETABLE WHERE IDATE BETWEEN 2018/01/01' AND '2018/12/31' AND SOMESTATUS = 1 ) 

【讨论】:

    【解决方案2】:

    很简单:

    SELECT SUM((1-SOMESTATUS)*amount + SOMESTATUS*(otherAmount))
    FROM EXAMPLETABLE
    WHERE IDATE BETWEEN '2018-01-01' AND '2018-12-31'
    

    ...小心你的约会。我认为你必须用破折号替换斜杠

    【讨论】:

    • 日期很好,您的解决方案对我不起作用,因为示例查询只是示例,实际上要复杂得多。
    【解决方案3】:

    您可以执行此条件聚合。

    SELECT SUM(case when IDATE BETWEEN '2017/01/01' AND '2017/12/31' AND SOMESTATUS = 0 then amount else 0 end) +
    SUM(case when IDATE BETWEEN '2018/01/01' AND '2018/12/31' AND SOMESTATUS = 1 then amount else 0 end) 
    FROM EXAMPLETABLE
    

    【讨论】:

      【解决方案4】:

      这是一个简单的方法:

      SELECT SUM(b.a)
      FROM (
          SELECT SUM(amount) a
          FROM EXAMPLETABLE
          WHERE IDATE BETWEEN '2017/01/01'
                  AND '2017/12/31'
              AND SOMESTATUS = 0
      
          UNION ALL
      
          SELECT SUM(otherAmount) a
          FROM EXAMPLETABLE
          WHERE IDATE BETWEEN '2018/01/01'
                  AND '2018/12/31'
              AND SOMESTATUS = 1
          ) AS b
      

      我刚刚在两个查询之间创建了一个联合并将结果相加。

      【讨论】:

      • 您能解释一下这是如何工作的吗?从我的测试中,我会说它确实可以满足我的需要,但遗憾的是我不明白如何
      • 当然!基本上通过使用命令 UNION ALL 将两个查询的所有结果合并为一个(注意:您可以只使用 UNION 但它会隐藏相同的结果)然后我将这两个查询用作子查询,方法是在新的 FROM 之后和之间插入括号,然后我将其称为“b”,主查询只是对其求和。你的错误是什么?你怎么了?
      • 我理解正确吗,使用此查询我将遍历表 2 次?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多