
SQL中要实现带条件求和,最核心且普遍适用的方法就是将
SUM
CASE WHEN
说实话,当我第一次接触到需要“条件求和”这种需求时,脑子里最先冒出来的可能是写好几个子查询,或者用多个
WHERE
UNION ALL
SUM(CASE WHEN ...)
它的基本语法结构是这样的:
SELECT
SUM(CASE
WHEN condition_1 THEN value_to_sum_if_true
WHEN condition_2 THEN value_to_sum_if_true_for_condition_2
-- 可以有更多的WHEN子句
ELSE value_to_sum_if_all_false -- 通常是0,或者NULL(如果希望完全忽略)
END) AS ConditionalSumAlias
FROM
your_table;举个例子,假设我们有一个
Orders
OrderID
CustomerID
OrderAmount
OrderStatus
SELECT
SUM(CASE WHEN OrderStatus = 'Completed' THEN OrderAmount ELSE 0 END) AS TotalCompletedAmount,
SUM(CASE WHEN OrderStatus = 'Pending' THEN OrderAmount ELSE 0 END) AS TotalPendingAmount
FROM
Orders;这里面有几个小细节值得一提:
ELSE 0
SUM
ELSE NULL
ELSE NULL
SUM
NULL
ELSE 0
NULL
ELSE 0
这种写法非常强大,因为它在一个SQL查询中就能完成多个条件下的聚合计算,避免了多次扫描表,效率自然就高了。
CASE WHEN
这个问题问得好,因为在SQL的世界里,很多问题往往不止一种解法。但就“在聚合函数内部进行条件判断”这个层面而言,
CASE WHEN
当然,有些数据库系统提供了自己的语法糖。比如PostgreSQL就有一个非常优雅的
FILTER
-- PostgreSQL特有的语法
SELECT
SUM(OrderAmount) FILTER (WHERE OrderStatus = 'Completed') AS TotalCompletedAmount,
SUM(OrderAmount) FILTER (WHERE OrderStatus = 'Pending') AS TotalPendingAmount
FROM
Orders;你看,这种写法确实更精炼,减少了重复的
OrderAmount
SUM(CASE WHEN ...)
有时候,我们可能会用子查询或者CTE(Common Table Expression)来预先筛选数据,然后再进行聚合。比如:
WITH CompletedOrders AS (
SELECT OrderAmount
FROM Orders
WHERE OrderStatus = 'Completed'
),
PendingOrders AS (
SELECT OrderAmount
FROM Orders
WHERE OrderStatus = 'Pending'
)
SELECT
(SELECT SUM(OrderAmount) FROM CompletedOrders) AS TotalCompletedAmount,
(SELECT SUM(OrderAmount) FROM PendingOrders) AS TotalPendingAmount;这种方法虽然也能达到目的,但通常会涉及多次数据扫描或者更多的中间结果集,对于简单的条件求和,性能往往不如
SUM(CASE WHEN ...)
SUM(CASE WHEN ...)
SUM(CASE WHEN ...)
SUM(CASE WHEN ...)
当需求变得更复杂,比如我们需要在多个维度上进行条件求和,或者需要按某个字段分组后再进行条件求和时,
SUM(CASE WHEN ...)
1. 多重条件求和: 假设我们不仅想知道已完成和待处理订单的总金额,还想知道那些“金额超过1000且已完成”的订单总金额。你可以在一个
SUM
WHEN
SUM(CASE WHEN ...)
SELECT
SUM(CASE WHEN OrderStatus = 'Completed' THEN OrderAmount ELSE 0 END) AS TotalCompletedAmount,
SUM(CASE WHEN OrderStatus = 'Pending' THEN OrderAmount ELSE 0 END) AS TotalPendingAmount,
SUM(CASE WHEN OrderStatus = 'Completed' AND OrderAmount > 1000 THEN OrderAmount ELSE 0 END) AS LargeCompletedOrdersAmount
FROM
Orders;这里,
LargeCompletedOrdersAmount
2. 分组条件求和: 这可能是最常见的应用场景之一。比如,我们想按
CustomerID
SELECT
CustomerID,
SUM(CASE WHEN OrderStatus = 'Completed' THEN OrderAmount ELSE 0 END) AS CustomerCompletedAmount,
SUM(CASE WHEN OrderStatus = 'Pending' THEN OrderAmount ELSE 0 END) AS CustomerPendingAmount,
SUM(OrderAmount) AS CustomerTotalAmount -- 也可以加上总金额
FROM
Orders
GROUP BY
CustomerID
ORDER BY
CustomerID;通过
GROUP BY CustomerID
最佳实践总结:
WHEN
ELSE
ELSE 0
NULL
AVG
COUNT
SUM
0
NULL
CASE WHEN
SUM(CASE WHEN ...)
尽管
SUM(CASE WHEN ...)
1. 过度复杂的CASE WHEN
CASE WHEN
WHEN
WHEN
2. 缺少必要的索引:
SUM(CASE WHEN ...)
CASE
WHERE
GROUP BY
WHERE
GROUP BY
ORDER BY
CASE WHEN
CASE
OrderStatus
3. 数据类型不匹配导致的隐式转换: 在
CASE WHEN
THEN
ELSE
THEN
ELSE
OrderAmount
DECIMAL
ELSE
0
0.0
4. 大表的全表扫描: 如果你的表非常大,并且查询没有
WHERE
SUM(CASE WHEN ...)
WHERE
WHERE OrderDate >= '...'
CASE WHEN
总的来说,
SUM(CASE WHEN ...)
CASE WHEN
以上就是SQLSUM函数带条件求和怎么写_SQLSUM条件求和CASE用法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号