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位小数,去掉末尾的零