SQL Server如何添加带条件的行统计列?
实现每行展示全局统计值的SQL方案
要在每行中返回全表级的统计值,核心是利用不带分区的窗口函数,对整个数据集进行条件统计。以下是具体实现方式:
通用SQL写法(兼容所有主流数据库)
假设你的表名为patient_records,可以用CASE表达式结合窗口函数实现需求:
SELECT Name, PAT_ID, Has_T, Has_Y, Has_G, COUNT(*) OVER () AS Total_PATS, -- 全表总行数 SUM(CASE WHEN Has_T = 'X' THEN 1 ELSE 0 END) OVER () AS Total_T, -- Has_T为'X'的行数 SUM(CASE WHEN Has_Y = 'X' THEN 1 ELSE 0 END) OVER () AS Total_Y -- Has_Y为'X'的行数 FROM patient_records;
逻辑说明
COUNT(*) OVER ():你已用到的方式,窗口函数不指定分区时,会对整个数据集计数,得到全表总行数。SUM(CASE...) OVER ():通过CASE将符合条件的行标记为1,不符合的标记为0,再对全表求和,最终得到符合条件的总行数。
可选简洁写法(部分数据库支持)
如果使用PostgreSQL、BigQuery等支持FILTER子句的数据库,可用更直观的语法:
SELECT Name, PAT_ID, Has_T, Has_Y, Has_G, COUNT(*) OVER () AS Total_PATS, COUNT(*) FILTER (WHERE Has_T = 'X') OVER () AS Total_T, COUNT(*) FILTER (WHERE Has_Y = 'X') OVER () AS Total_Y FROM patient_records;
这种写法可读性更强,但CASE的写法兼容性更广,适合跨数据库场景。
内容的提问来源于stack exchange,提问作者KapSht
相关产品推荐
相关产品推荐

