根据关联列值动态包含/排除列的T-SQL查询修改需求
动态调整非空列统计的T-SQL解决方案
嘿,我来帮你搞定这个动态统计的需求!根据你给出的规则,我们可以通过在CROSS APPLY中加入条件判断,结合主表的字段值来动态决定是否包含指定列,同时保证统计的列数和占比计算准确。
修改后的查询代码如下:
SELECT COUNT(v.col) AS num_not_null, CASE WHEN SUM(v.col_count) = 0 THEN 0 ELSE COUNT(v.col) * 1.0 / SUM(v.col_count) * 100 END AS percent_not_null, SUM(v.col_count) AS toltalColsNeedsFilled FROM EFP_EmploymentUser t CROSS APPLY (VALUES -- 固定要统计的列 (t.ITAdvicedFirst, 1), (t.ITAdvicedSecond, 1), (t.ITDepartmentDone, 1), (t.CFOAdvicedFirst, 1), (t.CFOInfoProvided, 1), (t.CFOAdvicedSecond, 1), (t.CFODone, 1), (t.EconomyAdviced, 1), (t.EconomyDone, 1), (t.WhoIsWhoAdviced, 1), (t.WhoIsWhoDone, 1), (t.KeyCardAdviced, 1), (t.KeyCardDone, 1), -- 动态列:Academy相关 (CASE WHEN t.Academy = 'yes' THEN t.AcademyAdviced ELSE NULL END, CASE WHEN t.Academy = 'yes' THEN 1 ELSE 0 END), (CASE WHEN t.Academy = 'yes' THEN t.AcademyDone ELSE NULL END, CASE WHEN t.Academy = 'yes' THEN 1 ELSE 0 END), -- 动态列:Publicator相关 (CASE WHEN t.Publicator = 'yes' THEN t.PublicatorDone ELSE NULL END, CASE WHEN t.Publicator = 'yes' THEN 1 ELSE 0 END), (CASE WHEN t.Publicator = 'yes' THEN t.PortraitAdviced ELSE NULL END, CASE WHEN t.Publicator = 'yes' THEN 1 ELSE 0 END), -- 动态列:Bogportal相关 (CASE WHEN t.Bogportal = 'yes' THEN t.BogportalAdviced ELSE NULL END, CASE WHEN t.Bogportal = 'yes' THEN 1 ELSE 0 END), (CASE WHEN t.Bogportal = 'yes' THEN t.BogportalDone ELSE NULL END, CASE WHEN t.Bogportal = 'yes' THEN 1 ELSE 0 END) ) v(col, col_count) WHERE ID = '19';
思路说明:
- 动态包含列:对每个需要条件判断的列,用
CASE语句——当对应字段(如Academy)为'yes'时返回原列值,否则返回NULL。这样COUNT(v.col)会自动忽略NULL值,相当于排除了不满足条件的列。 - 动态计算总列数:新增
col_count字段,满足条件时标记为1,否则为0。通过SUM(v.col_count)就能得到当前需要统计的总列数,替代原来固定的COUNT(*)。 - 占比计算优化:加入
CASE判断避免除以0的异常情况(当所有动态列都不满足且固定列也全为空时)。
这样修改后,查询会根据Academy、Publicator、Bogportal的取值自动调整统计范围,完全符合你的需求。
内容的提问来源于stack exchange,提问作者user1185428
相关产品推荐
相关产品推荐

