如何用DQL统计总借方大于总贷方的欠费会员数量
问题:用DQL统计总借方超过总贷方的会员数量
业务需求:从俱乐部会员缴费数据库中,统计总借方(debit)金额大于总贷方(credit)金额的会员总数。
示例数据
| id | firstname | member_id | object | debit | credit |
|---|---|---|---|---|---|
| 1 | Marc | 1 | dues | NULL | 20 |
| 2 | Paul | 2 | dues | NULL | 20 |
| 3 | Denis | 3 | dues | NULL | 60 |
| 36 | Marc | 1 | dues | 20 | 0 |
| 38 | Paul | 2 | dues | 20 | 0 |
| 39 | Denis | 3 | dues | 0 | 40 |
| 63 | Marc | 1 | dues | 40 | 0 |
| 64 | Paul | 2 | dues | 40 | 0 |
| 65 | Paul | 2 | dues | 0 | 40 |
| 66 | Denis | 3 | dues | 0 | 20 |
遇到的问题
最初尝试直接在WHERE子句中使用聚合函数筛选,写法如下:
->select( COUNT(member_id) ) ->where ( SUM(debit) > SUM(credit) ) ->getQuery() ->getSingleScalarResult();
但SQL规范中WHERE不能直接使用聚合函数,因此该写法报错。
尝试过用GROUP BY member_id配合HAVING SUM(debit) > SUM(credit),但查询返回的是符合条件的会员分组数据(数组),无法直接拿到单一的统计数字。
解决方案:嵌套查询+聚合统计
通过嵌套查询先筛选出符合条件的会员,再在外层统计数量,即可用DQL实现需求。
写法1:使用DQL查询构建器
$count = $entityManager->createQueryBuilder() ->select('COUNT(sub.member_id)') ->from('YourBundle:MemberDues', 'md') ->innerJoin( '(SELECT member_id, SUM(debit) AS total_debit, SUM(credit) AS total_credit FROM YourBundle:MemberDues GROUP BY member_id HAVING total_debit > total_credit)', 'sub', 'md.member_id = sub.member_id' ) ->getQuery() ->getSingleScalarResult();
写法2:直接DQL语句
SELECT COUNT(sub.member_id) FROM YourBundle:MemberDues md INNER JOIN ( SELECT member_id, SUM(debit) AS total_debit, SUM(credit) AS total_credit FROM YourBundle:MemberDues GROUP BY member_id HAVING total_debit > total_credit ) sub ON md.member_id = sub.member_id
逻辑说明
- 子查询部分:按
member_id分组,计算每个会员的总借方(total_debit)和总贷方(total_credit),通过HAVING筛选出total_debit > total_credit的会员。 - 外层查询:统计子查询返回的会员数量,通过
getSingleScalarResult()直接拿到单一的数字结果。
另外需要注意:debit字段存在NULL值,聚合函数SUM()会自动忽略NULL,无需额外处理。
内容的提问来源于stack exchange,提问作者CamilleFF
相关产品推荐
相关产品推荐

