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位小数,去掉末尾的零
相关推荐
海兰22 分钟前
【数据库】tdsql(MySQL )的事务隔离级别
android·数据库·mysql
灵析表格41 分钟前
Excel连接MySQL的函数化革命:灵析表格MySQL函数族业务应用分析
数据库·mysql·adb·excel·wps·灵析表格·excel公式盒子
todoitbo1 小时前
把发票台账接进 Codex:KingbaseES MCP 的一次只读风险排查实践
数据库·oracle·codex·kingbasees·mcp
Navicat中国1 小时前
使用 Navicat 轻松生成数据库测试数据
数据库·数据
zyplayer-doc1 小时前
核心制度不该被随手修改:用zyplayer-doc锁定文档和全部子文档
大数据·数据库·人工智能·笔记·pdf·ocr
一路向北North2 小时前
Spring AI(11) :ChatPDF-向量数据库、PDF处理、向量写入和向量搜索
数据库·人工智能·spring
暗暗别做白日梦2 小时前
CompletableFuture 并发统计
网络·数据库·oracle
ClouGence2 小时前
告别 Navicat!CloudDM:开源免费一站式数据库开发管理工具
数据库·sql·开源·数据库开发
灵析表格2 小时前
灵析表格功能函数深度分析报告
前端·数据库·microsoft
jaboo122 小时前
postgresql从入门到精通
数据库·postgresql·langchain