SQL 合并总和选择一个结果

Posted

技术标签:

【中文标题】SQL 合并总和选择一个结果【英文标题】:SQL merge sum selects to one result 【发布时间】: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,将添加为标签 【参考方案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 次?

以上是关于SQL 合并总和选择一个结果的主要内容,如果未能解决你的问题,请参考以下文章

SQL合并两个具有不同列号的选择查询,同时删除重复项?

按最大总和选择,但结果中没有总和

将第一个 SQL 选择语句结果用于第二个选择语句

如何在同一查询中添加两个选择命令的结果

SQL、值过多、结果合并

sql 选择多个总和