如何在SQL中实现当Column B为0时取Column A值生成Column C
实现“取B值,B为0时取A值”的SQL计算列
你可以用SQL的CASE表达式来实现和Excel IF(B2=0,A2,B2)完全相同的逻辑——这是标准SQL语法,几乎所有关系型数据库(比如MySQL、PostgreSQL、SQL Server等)都支持。如果你的数据库支持IF函数(比如MySQL、SQLite),也可以直接用IF函数,不过CASE的兼容性更好。
修正并修改后的SQL代码
首先,你的原SQL存在几个语法和逻辑问题:
location as loc后面缺少逗号- 聚合后的分组字段不需要包含
columnA和columnB(因为你已经对这两列做了Sum聚合,应该按date, shift, location分组)
以下是修正后并添加了Column C的完整代码:
SELECT date, shift, location AS loc, SUM(columnA) AS A, SUM(columnB) AS B, -- 核心逻辑:当B的总和为0时取A的总和,否则取B的总和 CASE WHEN SUM(columnB) = 0 THEN SUM(columnA) ELSE SUM(columnB) END AS C FROM data WHERE date = (SELECT max(date) FROM data) AND location IN ('locationA','LocationB') GROUP BY date, shift, location ORDER BY date, shift
如果你的数据库支持IF函数(比如MySQL),也可以把CASE替换成更简洁的IF写法:
IF(SUM(columnB) = 0, SUM(columnA), SUM(columnB)) AS C
最终效果
执行上述代码后,你会得到符合预期的结果,类似:
| Date | Shift | Location | Value A | Value B | Value C |
|---|---|---|---|---|---|
| 21-05-2018 | Day | locationA | 0.04122204 | 0.887057531 | 0.887057531 |
| 21-05-2019 | Day | locationA | 0.928499827 | 0.580402396 | 0.580402396 |
| 21-05-2020 | Day | locationB | 0.092689448 | 0 | 0.092689448 |
| 21-05-2021 | Day | locationA | 0.848076929 | 0.300175453 | 0.300175453 |
| 21-05-2022 | Day | locationA | 0.231515332 | 0 | 0.231515332 |
| 21-05-2023 | Day | locationB | 0.982522662 | 0.560335678 | 0.560335678 |
内容的提问来源于stack exchange,提问作者Diacide
相关产品推荐
相关产品推荐

