如何使用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
相关产品推荐
相关产品推荐

