T-SQL如何统计单条记录多列不同货币值的数量
T-SQL 实现每行多字段去重计数方案
推荐方案(兼容 SQL Server 2008 及以上版本)
通过VALUES子句将同一行的4个货币字段转为临时行集,直接统计去重后的值数量即可,语法简洁易维护:
SELECT *, ( SELECT COUNT(DISTINCT CurrVal) FROM (VALUES (Curr1), (Curr2), (Curr3), (Curr4)) AS t(CurrVal) -- 若不需要将NULL计入统计,可取消下一行注释 -- WHERE CurrVal IS NOT NULL ) AS CurrencyCount FROM 你的表名
该方案完全匹配示例计算逻辑:
- 字段值为
GBP、USD、GBP、GBP时返回2 - 字段值为
GBP、EUR、GBP、USD时返回3 - 字段值全为
GBP时返回1 - 字段值为
GBP、GBP、GBP、EUR时返回2
兼容老旧版本方案(支持 SQL Server 2000 及以上)
如果你的数据库版本不支持VALUES子句构造多行,可以用逐层去重判断的方式实现:
SELECT *, CASE WHEN Curr1 IS NOT NULL THEN 1 ELSE 0 END + CASE WHEN Curr2 IS NOT NULL AND Curr2 <> Curr1 THEN 1 ELSE 0 END + CASE WHEN Curr3 IS NOT NULL AND Curr3 NOT IN (Curr1, Curr2) THEN 1 ELSE 0 END + CASE WHEN Curr4 IS NOT NULL AND Curr4 NOT IN (Curr1, Curr2, Curr3) THEN 1 ELSE 0 END AS CurrencyCount FROM 你的表名
持久化计算结果
如果需要将CurrencyCount作为表的固定列自动计算,可以新增计算列:
ALTER TABLE 你的表名 ADD CurrencyCount AS ( SELECT COUNT(DISTINCT CurrVal) FROM (VALUES (Curr1), (Curr2), (Curr3), (Curr4)) AS t(CurrVal) )
内容的提问来源于stack exchange,提问作者Martin Ward
相关产品推荐
相关产品推荐

