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
amount
和 otherAmount
在我的示例查询中被选中。
我尝试关注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 合并总和选择一个结果的主要内容,如果未能解决你的问题,请参考以下文章