如何高效统计SQL透视查询中月份列的空值列数?
高效统计月份列空值数量的方法
不用逐个写CASE WHEN,可以利用数据库的特性简化代码,同时保持执行效率:
SELECT Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec, (Jan IS NULL) + (Feb IS NULL) + (Mar IS NULL) + (Apr IS NULL) + (May IS NULL) + (Jun IS NULL) + (Jul IS NULL) + (Aug IS NULL) + (Sep IS NULL) + (Oct IS NULL) + (Nov IS NULL) + (Dec IS NULL) AS Null_Month_Count FROM your_pivoted_table;
原理说明
在MySQL、PostgreSQL、SQL Server等多数关系型数据库中,列名 IS NULL会返回布尔值,参与加法运算时,数据库会自动将TRUE转为1,FALSE转为0,累加后就是所有月份列的空值总数。
Oracle等特殊数据库兼容写法
如果使用Oracle这类不支持布尔值直接参与数值运算的数据库,用NVL2函数替代:
SELECT Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec, NVL2(Jan, 0, 1) + NVL2(Feb, 0, 1) + NVL2(Mar, 0, 1) + NVL2(Apr, 0, 1) + NVL2(May, 0, 1) + NVL2(Jun, 0, 1) + NVL2(Jul, 0, 1) + NVL2(Aug, 0, 1) + NVL2(Sep, 0, 1) + NVL2(Oct, 0, 1) + NVL2(Nov, 0, 1) + NVL2(Dec, 0, 1) AS Null_Month_Count FROM your_pivoted_table;
NVL2(列名, 非空返回值, 空返回值)这里指定非空时返回0,空时返回1,累加结果同样是空值总数,比CASE WHEN写法更简洁。
优势对比
这种写法和CASE WHEN执行效率基本一致,但代码量减少一半以上,可读性和维护性更强,不需要重复写冗余的条件判断语句。
内容的提问来源于stack exchange,提问作者PRI
相关产品推荐
相关产品推荐

