如何编写适配项目经理、业务单元或账号的统计SQL查询
统一SQL查询方案:根据任一条件过滤统计
我来帮你搞定这个统一查询的需求!你可以通过参数化条件判断来实现,既灵活还能避免SQL注入风险,下面给你两种实用的实现方式:
方式一:优先级式条件判断(推荐)
这种方式会按优先级依次检查参数,只有第一个非空的参数会生效(比如优先用项目经理条件,其次业务单元,最后账号);如果所有参数都为空,你可以选择返回空结果或者全量统计,这里默认返回空:
SELECT statusid, COUNT(statusid) AS status_count, -- 给统计字段起别名更易读 SUM(totalamount) AS total_amount FROM intrahrms_rems_reimbursement WHERE CASE WHEN @projectmanagerid IS NOT NULL THEN projectmanagerid = @projectmanagerid WHEN @businessunitid IS NOT NULL THEN businessunitid = @businessunitid -- 注意你之前的查询里拼写错了,是businessunitid不是businesunitid WHEN @accountsid IS NOT NULL THEN accountsid = @accountsid ELSE 1 = 0 -- 所有参数为空时返回空结果,改成1=1可返回全量统计 END GROUP BY statusid;
方式二:多条件任选(支持同时传多个参数)
如果你需要支持同时传入多个参数(比如既按项目经理又按业务单元过滤),可以用OR结合非空判断:
SELECT statusid, COUNT(statusid) AS status_count, SUM(totalamount) AS total_amount FROM intrahrms_rems_reimbursement WHERE (@projectmanagerid IS NULL OR projectmanagerid = @projectmanagerid) AND (@businessunitid IS NULL OR businessunitid = @businessunitid) AND (@accountsid IS NULL OR accountsid = @accountsid) GROUP BY statusid;
注意:这种写法如果多个参数都传值,会同时应用所有过滤条件,返回满足所有条件的结果。
补充小提示
- 这里的
@projectmanagerid、@businessunitid、@accountsid是参数占位符,不同数据库写法略有差异:MySQL用?或@,SQL Server用@,PostgreSQL用$1、$2等,你根据自己用的数据库调整就行。 - 一定要用参数化查询,别直接拼接字符串,防止SQL注入攻击。
- 记得修正你之前第二个查询里的字段拼写错误:
businesunitid应该是businessunitid哦。
内容的提问来源于stack exchange,提问作者Tirth Timaniya
相关产品推荐
相关产品推荐

