SQL查询现金与信用交易占比结果不符,求正确实现方案
问题解决:统计交易类型整体占比
原SQL的核心问题是使用了GROUP BY type,这会按交易类型分组统计数据。此时COUNT(*)指代的是当前分组内的交易数量,而非全表总交易数,因此计算出的是每组内部的占比(每组自身占比100%,另一类型占比0),完全不符合整体占比的统计需求。
修正后的SQL语句
SELECT ROUND(SUM(CASE WHEN Type = 'Cash' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 0) || '%' AS "现金占比(%Cash)", ROUND(SUM(CASE WHEN Type = 'Credit' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 0) || '%' AS "信用占比(%Credit)" FROM vending_machine_sales;
关键调整说明
- 移除
GROUP BY type,让查询基于全表数据计算整体占比 - 使用
100.0而非100,确保除法结果为浮点数,避免整数除法导致的精度丢失(比如3/2在整数除法中会得到1,而非1.5) ROUND(..., 0)将结果取整,匹配你期望的整数百分比格式- 字符串拼接百分号:
||适用于PostgreSQL、SQLite等数据库;若使用MySQL可替换为CONCAT(..., '%'),SQL Server则用+
原实际错误结果
| 交易类型(TYPE) | 现金占比(%Cash) | 信用占比(%Credit) |
|---|---|---|
| 2148 | 0 | 100 |
| 4297 | 100 | 0 |
期望正确结果
| 现金占比(%Cash) | 信用占比(%Credit) |
|---|---|
| 67% | 33% |
内容的提问来源于stack exchange,提问作者Nickolas Jaramillo
相关产品推荐
相关产品推荐

