You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server 2014:基于另一列求和报错(varchar转real失败)

问题与解决

执行的SQL语句

SELECT 
    HCT_USER_CONTRACT_NUMBER AS ContractNumber, 
    SUM(CASE 
            WHEN HIT_CURRENT_STOCK_NUMBER = '_DELIVERY' 
                THEN HIT_CHARGE_AMOUNT 
                ELSE 0 
        END) AS [DeliveryCharge]
FROM 
    TH_HIRE_CONTRACTS C 
LEFT JOIN 
    TH_HIRE_ITEMS I on C.HCT_CONTRACT_NUMBER = I.HIT_CONTRACT_NUMBER
GROUP BY 
    HCT_USER_CONTRACT_NUMBER

报错信息

Error converting data type varchar to real

需求说明

TH_HIRE_CONTRACTS表的每条记录对应TH_HIRE_ITEMS表的多条数据,其中租赁物品、配送、回收各占一行。需要按合同号聚合,仅汇总其中HIT_CURRENT_STOCK_NUMBER为'_DELIVERY'的HIT_CHARGE_AMOUNT值,每个合同返回一条记录。

解决方法

报错原因是HIT_CHARGE_AMOUNT字段为varchar类型,直接参与SUM运算时SQL会自动尝试将其转为数值类型,若字段中存在无法转换的内容就会触发报错。需要显式转换该字段为数值类型,推荐用TRY_CAST避免转换失败导致整个查询中断:

SELECT 
    HCT_USER_CONTRACT_NUMBER AS ContractNumber, 
    SUM(CASE 
            WHEN HIT_CURRENT_STOCK_NUMBER = '_DELIVERY' 
                THEN TRY_CAST(HIT_CHARGE_AMOUNT AS DECIMAL(18,2)) 
                ELSE 0 
        END) AS [DeliveryCharge]
FROM 
    TH_HIRE_CONTRACTS C 
LEFT JOIN 
    TH_HIRE_ITEMS I on C.HCT_CONTRACT_NUMBER = I.HIT_CONTRACT_NUMBER
GROUP BY 
    HCT_USER_CONTRACT_NUMBER

如果确定HIT_CHARGE_AMOUNT的所有有效值都能正常转换,也可以使用CAST或CONVERT:

SUM(CASE 
        WHEN HIT_CURRENT_STOCK_NUMBER = '_DELIVERY' 
            THEN CAST(HIT_CHARGE_AMOUNT AS DECIMAL(18,2)) 
            ELSE 0 
    END) AS [DeliveryCharge]

另外,也可以先过滤出配送行再聚合,减少不必要的计算:

SELECT 
    C.HCT_USER_CONTRACT_NUMBER AS ContractNumber, 
    SUM(TRY_CAST(I.HIT_CHARGE_AMOUNT AS DECIMAL(18,2))) AS [DeliveryCharge]
FROM 
    TH_HIRE_CONTRACTS C 
LEFT JOIN 
    TH_HIRE_ITEMS I on C.HCT_CONTRACT_NUMBER = I.HIT_CONTRACT_NUMBER
        AND I.HIT_CURRENT_STOCK_NUMBER = '_DELIVERY'
GROUP BY 
    C.HCT_USER_CONTRACT_NUMBER

内容的提问来源于stack exchange,提问作者FDSQL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:25:38