You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Presto中实现ID与名称静态映射并计算百分比

实现静态映射与百分比计算的SQL方案

源表table1数据:

idmarkstotal
178100
22050

已知静态映射:1 -> Sam、2 -> Joe,需要生成包含id、percentage(marks/total*100)、name的结果表:

idpercentagename
178Sam
240Joe

方法一:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 03:42:42