如何在同一位置同时编写两条同表分状态金额统计的SQL查询
问题根因
你写的SQL有两个明确的语法错误:
- 带空格的别名没有加标识符包裹,
paid Amount、unpaid Amount会被解析器拆成两个独立token,直接触发语法报错 - 不能用
AND拼接两个独立的SELECT语句,这种写法不符合SQL语法规范,无法同时返回两列统计结果。
正确写法
用条件聚合一次查表就能出结果,性能最优,兼容所有支持SQL92标准的数据库:
SELECT SUM(CASE WHEN status = '1' THEN amount ELSE 0 END) AS `paid Amount`, SUM(CASE WHEN status = '0' THEN amount ELSE 0 END) AS `unpaid Amount` FROM transaction WHERE user_id = '10';
写法注意点
- 带空格的别名需要用对应数据库的标识符包裹:MySQL/MariaDB/ClickHouse等用反引号
`,PostgreSQL/Oracle/SQL Server用双引号" - 公共筛选条件
user_id = '10'直接放在WHERE层提前过滤数据,比在子查询里重复写筛选条件效率高很多。
如果你用的是MySQL这类支持IF函数的数据库,也可以写得更简洁:
SELECT SUM(IF(status = '1', amount, 0)) AS `paid Amount`, SUM(IF(status = '0', amount, 0)) AS `unpaid Amount` FROM transaction WHERE user_id = '10';
不要尝试写两个独立SELECT拼接结果的写法,要么触发语法错误,要么会重复扫描同一张表,数据量上来之后性能差距非常明显。
内容的提问来源于stack exchange,提问作者Bhaskar Choudhary
相关产品推荐
相关产品推荐

