【问题标题】:SQL GROUPING values from the same table来自同一个表的 SQL GROUPING 值
【发布时间】: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


【解决方案1】:

不肯定我遵循您所追求的,但如果您不想要多条记录,您可以消除第二组连接并扩展您的 JOIN 标准:

SELECT payments.payamount
      ,COALESCE(resorts1.resortname, '') AS rname  
FROM payments  
LEFT JOIN pupilbookings 
      ON payments.bookingcode= pupilbookings.bookingcode
LEFT JOIN lessons AS lessons1 
      ON   pupilbookings.lessonscode = lessons1.lessonscode
        OR pupilbookings.coursecode = lessons1.coursecode                       
LEFT JOIN resorts AS resorts1 
      ON lessons1.resortcode = resorts1.resortcode
WHERE paydate = ' & date_here & '  
GROUP BY payamount, resorts1.resortname
ORDER BY rname

【讨论】:

  • 这似乎成功了。非常感谢您的帮助,非常感谢。
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多