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位小数,去掉末尾的零
相关推荐
啥都不懂的小小白几秒前
MVCC深度解析:MySQL如何实现高效无阻塞的并发读写
数据库·mysql·mvcc
程序员根根4 分钟前
MySQL 事务全解析:从 ACID 特性到实战落地(部门 - 员工场景)
数据库·后端
爱吃山竹的大肚肚4 分钟前
MySQL 支持的各类索引
java·数据库·sql·mysql·spring·spring cloud
黑白极客5 分钟前
mysql的 order by是怎么工作的?redo-log和binlog为什么采用双确认机制?
数据库·mysql
程序员水自流8 分钟前
MySQL常用内置函数详细介绍
java·数据库·mysql
慌糖9 分钟前
开发当中常见注解备注
数据库·sql
小韩博11 分钟前
PHP-MySQL 数据请求与 SQL 注入多样性(小迪 43 课笔记整理)
sql·mysql·php
TAEHENGV11 分钟前
关于应用模块 Cordova 与 OpenHarmony 混合开发实战
android·javascript·数据库
赵思空14 分钟前
window docker 安装 mysql 数据库,及不能连接问题
数据库·mysql·docker
yinshuilan14 分钟前
Postgresql安装配置
数据库·postgresql