【发布时间】:2013-12-16 16:28:52
【问题描述】:
我在处理大型(100,000 条记录)SQL 数据库时遇到问题。
这是基本结构:
bookings - 预订代码、预订日期
付款 - 付款代码、预订代码、付款日期、付款金额
学生记录 - prcode、bookingcode、课程代码、课程代码
课程 - 课程代码、课程代码、度假村代码
度假村 - 度假村代码、度假村名称
备注
学生记录可以包含课程代码或课程代码,但不能同时包含两者。
课程表中的记录可能包含也可能不包含课程代码,如果包含,则链接到学生记录,如果不包含,则学生记录由课程代码链接。
我需要生成一份报告,显示在特定日期收到了哪些付款。这是我目前运行的 SQL 代码:
SELECT payments.payamount,
(COALESCE(resorts1.resortname, '') + COALESCE(resorts2.resortname, '')) AS rname
FROM payments
LEFT JOIN pupilbookings
ON payments.bookingcode = pupilbookings.bookingcode
LEFT JOIN lessons AS lessons1
ON pupilbookings.lessonscode = lessons1.lessonscode
LEFT JOIN resorts AS resorts1
ON lessons1.resortcode = resorts1.resortcode
LEFT JOIN lessons AS lessons2
ON pupilbookings.coursecode = lessons2.coursecode
LEFT JOIN resorts AS resorts2
ON lessons2.resortcode = resorts2.resortcode
WHERE paydate = ' & date_here & '
GROUP BY payamount,
resorts1.resortname,
resorts2.resortname
ORDER BY rname
只要预订没有两个学生记录,一切都会运行良好 - 一个带有课程代码,另一个课程代码指向单独的“课程”记录,但最终是一个“度假村”记录”。如果发生这种情况,付款被列出两次。
我如何对度假村名称(生成为 rname)进行分组,以便记录仅出现一次,即使它以两种方式与原始付款相关联。
我希望一切都有意义!
【问题讨论】:
-
如果有两条支付记录,你要总和吗?如果您只想要其中一项记录,您想要哪一项?
-
只是备注:您没有使用任何聚合函数,因此您也不必使用 GROUP BY。如果您真的想选择不同的值,请改用 DISTINCT,实际上我认为这很奇怪。我同意 Dan Bracuk 的观点:想想你想选择什么。
-
我认为学生记录表的设计很糟糕。 - 它应该是 prcode、bookingcode、code、CodeType int 其中 CodeType=lessonscode,1 和 coursecode,2 和 code 将是课程代码然后 type=1 或 coursecode 和 type=2
-
课程中有一个标记,表明它是课程还是课程,但将其隐藏以免混淆。
标签: sql sql-server group-by concat