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位小数,去掉末尾的零
相关推荐
爱可生开源社区1 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1772 天前
《从零搭建NestJS项目》
数据库·typescript
加号32 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏2 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐2 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再2 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest2 天前
数据库SQL学习
数据库·sql
jnrjian2 天前
ORA-01017 查找机器名 用户名 以及library cache lock 参数含义
数据库·oracle
十月南城2 天前
数据湖技术对比——Iceberg、Hudi、Delta的表格格式与维护策略
大数据·数据库·数据仓库·hive·hadoop·spark
Henry Zhu1232 天前
数据库:并发控制基本概念
服务器·数据库