如何在Presto中实现ID与名称静态映射并计算百分比
实现静态映射与百分比计算的SQL方案
源表table1数据:
| id | marks | total |
|---|---|---|
| 1 | 78 | 100 |
| 2 | 20 | 50 |
已知静态映射:1 -> Sam、2 -> Joe,需要生成包含id、percentage(marks/total*100)、name的结果表:
| id | percentage | name |
|---|---|---|
| 1 | 78 | Sam |
| 2 | 40 | Joe |
方法一:使用CASE语句直接映射
适合映射关系较少的场景,直接在查询中通过CASE匹配id返回对应名称,同时计算百分比:
SELECT id, -- 用100.0确保浮点运算,避免整数除法截断结果 ROUND((marks * 100.0 / total), 0) AS percentage, CASE id WHEN 1 THEN 'Sam' WHEN 2 THEN 'Joe' -- 可添加更多映射,或用ELSE处理未匹配的id ELSE 'Unknown' END AS name FROM table1;
方法二:使用CTE/临时表维护映射关系
如果映射关系较多,建议用CTE(公共表表达式)或临时表存储映射,查询时关联即可,更易维护:
用CTE的示例(支持PostgreSQL、MySQL 8.0+等):
WITH id_name_map AS ( SELECT 1 AS id, 'Sam' AS name UNION ALL SELECT 2 AS id, 'Joe' AS name ) SELECT t.id, ROUND((t.marks * 100.0 / t.total), 0) AS percentage, m.name FROM table1 t JOIN id_name_map m ON t.id = m.id;
用临时表的示例(兼容多数数据库):
-- 创建临时表存储映射 CREATE TEMPORARY TABLE id_name_map ( id INT PRIMARY KEY, name VARCHAR(50) ); INSERT INTO id_name_map VALUES (1, 'Sam'), (2, 'Joe'); -- 查询关联 SELECT t.id, ROUND((t.marks * 100.0 / t.total), 0) AS percentage, m.name FROM table1 t JOIN id_name_map m ON t.id = m.id;
注意事项
- 计算百分比时,要确保用浮点型运算(比如乘以100.0),避免部分数据库中整数除法导致结果截断(比如
20/50在整数除法中会得到0,乘以100还是0,而20*100.0/50会得到40)。 - 如果需要保留小数位数,可调整ROUND函数的第二个参数,比如
ROUND(..., 2)保留两位小数。
内容的提问来源于stack exchange,提问作者ir2pid
相关产品推荐
相关产品推荐

