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

如何使用CASE语句判断客户至少有1张未付发票时显示'debtor'

问题

如何使用CASE实现:当客户至少有一张发票未支付(Invoice_Status = 1)时显示'debtor'?
*单个客户对应多张发票
现有查询可返回Id_Customer及其名下多张发票的状态,但会针对该客户的每一张发票重复展示同一条Id_Customer记录:

SELECT Id_Customer, 
    CASE Invoice_Status
        WHEN 1 THEN 'Debtor'
        ELSE 'No debts'
    END AS Status
FROM Tb_Invoices
ORDER BY Id_Customer
GO
解决方案

现有查询是按单条发票维度返回结果,所以同一个客户会出现多条重复记录。要实现每个客户仅返回1条状态记录,只要存在任意未支付发票就标记为debtor,可以参考以下两种实现:

方案1:GROUP BY + 聚合判断(写法最简洁)

SELECT 
    Id_Customer,
    CASE 
        WHEN MAX(Invoice_Status) = 1 THEN 'debtor'
        ELSE 'No debts'
    END AS Status
FROM Tb_Invoices
GROUP BY Id_Customer
ORDER BY Id_Customer
GO

逻辑说明:只要客户名下存在任意一张状态为1的未支付发票,MAX(Invoice_Status)返回的结果就为1,符合CASE判断条件返回debtor;只有该客户所有发票都已支付时,才会返回No debts。GROUP BY Id_Customer保证每个客户仅返回一条记录。

方案2:EXISTS子查询(大数据量下性能更优)

如果数据量较大,不需要全量扫描单个客户的所有发票,可以用EXISTS子查询,只要找到一张未支付发票就会终止判断,执行效率更高:

SELECT 
    DISTINCT t1.Id_Customer,
    CASE 
        WHEN EXISTS (
            SELECT 1 FROM Tb_Invoices t2 
            WHERE t2.Id_Customer = t1.Id_Customer 
            AND t2.Invoice_Status = 1
        ) THEN 'debtor'
        ELSE 'No debts'
    END AS Status
FROM Tb_Invoices t1
ORDER BY t1.Id_Customer
GO

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:48:02