sql计算去除值后面的零

bidPrice 计算结果保留了太多小数位数。

推荐方案4(方案4:去掉末尾的零(保持小数,但去掉无意义的0))

方案1:使用 ROUND() 函数(推荐)

将计算结果四舍五入到指定小数位数:

sql 复制代码
select
    -- 基础项目信息(对应 SimilarProjectVO 核心字段)
    pwtpd.section_id AS sectionId,
    pwtpd.section_name AS projectName,  -- 项目名称(取标段名称)
    pwtpd.tower_in_total_price AS towerInTotalPrice, -- 塔筒报价
    pwtpd.project_price_contain_tower AS projectPriceContainTower, -- 项目报价包含塔筒
    pwtpd.project_price_not_tower AS projectPriceNotTower, -- 项目报价不包含塔筒
    pwtpd.win_bid_amount,
    -- 使用 ROUND 保留2位小数
    ROUND(
        (CAST(IFNULL(pwtpd.win_bid_amount, 0) AS DECIMAL(18, 0))
        / NULLIF(CAST(IFNULL(pwtpd.project_capacity, 0) AS DECIMAL(18, 0)) * 1000, 0)
        ), 2
    ) AS bidPrice,  -- 中标单价(保留2位小数)
    
    -- 其他字段保持不变
    bpi.purchase_type AS purchaseType, -- 是否框架采购
    CASE
    WHEN pwtpd.single_unit_capacity REGEXP '^[0-9.]+$'
    THEN CAST(pwtpd.single_unit_capacity AS DECIMAL(10,2))
    WHEN pwtpd.single_unit_capacity REGEXP '^[0-9.]+[~-][0-9.]+$'
    THEN (
    CAST(SUBSTRING_INDEX(pwtpd.single_unit_capacity, '~', 1) AS DECIMAL(10,2)) +
    CAST(SUBSTRING_INDEX(pwtpd.single_unit_capacity, '~', -1) AS DECIMAL(10,2))
    ) / 2
    ELSE NULL
    END AS singleUnitCapacityValue,
    CASE
    WHEN pwtpd.single_unit_capacity REGEXP '^[0-9.]+$'
    THEN CONCAT('单机', CAST(CAST(pwtpd.single_unit_capacity AS DECIMAL(10,2)) AS CHAR), 'MW')
    WHEN pwtpd.single_unit_capacity REGEXP '^[0-9.]+[~-][0-9.]+$'
    THEN CONCAT('单机', CAST( (
    CAST(SUBSTRING_INDEX(REPLACE(pwtpd.single_unit_capacity, '-', '~'), '~', 1) AS DECIMAL(10,2)) +
    CAST(SUBSTRING_INDEX(REPLACE(pwtpd.single_unit_capacity, '-', '~'), '~', -1) AS DECIMAL(10,2))
    ) / 2 AS CHAR), 'MW')
    ELSE NULL
    END AS singleUnitCapacity,
    CASE
    WHEN pwtpd.project_capacity REGEXP '^[0-9.]+$'
    THEN CAST(pwtpd.project_capacity AS DECIMAL(10,2))
    WHEN pwtpd.project_capacity REGEXP '^[0-9.]+[~-][0-9.]+$'
    THEN (
    CAST(SUBSTRING_INDEX(pwtpd.project_capacity, '~', 1) AS DECIMAL(10,2)) +
    CAST(SUBSTRING_INDEX(pwtpd.project_capacity, '~', -1) AS DECIMAL(10,2))
    ) / 2
    ELSE NULL
    END AS projectCapacityValue,
    pwtpd.tower_type as towerType,
    pwtpd.total_capacity_float_requirement as capacityFloatReq
from product_wind_turbine_detail_summary pwtpd
    left join bid_project_info bpi on pwtpd.section_id = bpi.section_id and pwtpd.company_id = bpi.company_id
where pwtpd.win_bid_status = 1 and pwtpd.company_id is not null and pwtpd.is_mixed_arrangement_allowed ='否'

方案2:使用 CAST() 指定小数位数

如果希望统一小数位数,可以使用 CAST()

sql 复制代码
-- 将 ROUND() 替换为 CAST()
CAST(
    (CAST(IFNULL(pwtpd.win_bid_amount, 0) AS DECIMAL(18, 0))
    / NULLIF(CAST(IFNULL(pwtpd.project_capacity, 0) AS DECIMAL(18, 0)) * 1000, 0)
    ) AS DECIMAL(18, 2)
) AS bidPrice,  -- 保留2位小数

方案3:完全去掉小数部分(只保留整数)

如果只需要整数:

sql 复制代码
-- 使用 FLOOR() 向下取整 或 ROUND(..., 0) 四舍五入取整
FLOOR(
    (CAST(IFNULL(pwtpd.win_bid_amount, 0) AS DECIMAL(18, 0))
    / NULLIF(CAST(IFNULL(pwtpd.project_capacity, 0) AS DECIMAL(18, 0)) * 1000, 0)
    )
) AS bidPrice,  -- 只保留整数部分(向下取整)

方案4:去掉末尾的零(保持小数,但去掉无意义的0)

使用 TRIM()CAST() 组合去掉末尾的零:

sql 复制代码
-- 保留小数,但去掉末尾的零
TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM 
    CAST(
        (CAST(IFNULL(pwtpd.win_bid_amount, 0) AS DECIMAL(18, 0))
        / NULLIF(CAST(IFNULL(pwtpd.project_capacity, 0) AS DECIMAL(18, 0)) * 1000, 0)
        ) AS DECIMAL(18, 4)
    )
)) AS bidPrice,  -- 保留4位小数,去掉末尾的零
相关推荐
这个DBA有点耶1 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G2 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备2 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远2 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
漂着的圆木2 天前
Agent 功能参与度:Copilot 怎么算
sql·数据分析·agent·githubcopilot·度量
2601_962218612 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
张洛闻Eren2 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安2 天前
MySQL-触发器
数据库·mysql
白远山2 天前
上海24小时自助健身房解决方案实战指南与经验分享
java·数据库·架构·需求分析
Omics Pro2 天前
斯坦福Nature+Science|广义虚拟细胞基础大模型
数据库·人工智能·算法·机器学习·自然语言处理