SQL关联两表计算课程缴费余额时无缴费记录学生不显示如何解决
问题原因排查
- 连接类型错误:当前使用
INNER JOIN内连接,仅会返回两张表seatno字段匹配的记录,seatno=1006在feetbl中无任何缴费记录,会被直接过滤。 - 过滤条件位置错误:将缴费日期的范围过滤写在WHERE子句中,左连接后无缴费记录的行缴费日期为NULL,会被条件直接排除。
- 空值未处理:无缴费记录时
SUM(ft.receivedamt)返回NULL,直接计算余额会得到NULL,不符合业务预期。
正确实现方案
替换内连接为左连接,将日期过滤条件移到JOIN的关联条件中,同时用ISNULL处理空值,修正后的SQL如下:
SELECT -- 无缴费记录时jdate返回空,如需默认展示可改为 COALESCE(CONVERT(VARCHAR, ft.receiveddate, 106), '未缴费') CONVERT(VARCHAR, ft.receiveddate, 106) AS jdate, st.seatno, st.sname, st.coursename, st.scoursefee, ISNULL(SUM(ft.receivedamt), 0) AS paid, st.scoursefee - ISNULL(SUM(ft.receivedamt), 0) AS balance FROM studenttbl st LEFT JOIN feetbl ft ON st.seatno = ft.seatno -- 日期过滤移到关联条件中,避免过滤无缴费的学生记录 AND ft.receiveddate BETWEEN '1990-01-01 00:00:00' AND '2021-10-05 00:00:00' GROUP BY st.seatno, st.sname, st.coursename, st.scoursefee, ft.receiveddate ORDER BY st.seatno DESC
执行后结果会包含seatno=1006的记录:jdate为空、paid为0、balance为4500,符合需求。
内容的提问来源于stack exchange,提问作者Vivek Raj Singh
相关产品推荐
相关产品推荐

