join,group和after count count SQL语句

时间:2017-10-30 14:17:37

标签: sql

我目前正在阅读一本书中的一些特殊情况,并发现了一项我无法解决的任务。

任务是打印每个低于50%的课程。

我需要打印出CourseId,CourseName,Time以及课程的填充方式。 (我可以通过计算课程中的人数除以课程中允许的最大人数100来计算课程的填充程度;(计数(CustomerIds)/ MaxCustomers)* 100)

表格如下:

Customers
-----------
CustomerId FK
CourseId FK

Course
-----------
CourseId PK
CourseTypeId FK
Time 

CourseType
------------
CourseTypeId PK
CourseName
MaxCustomers

这是我目前的工作方法:

SELECT course.CourseId, 
courseType.CourseName, 
course.Date, 
(COUNT(customers.CourseId) / courseType.MaxCustomers) * 100 as 'Fill in %' 
FROM Customers customers 
INNER JOIN Course course 
ON customers.CourseId = course.CourseId 
INNER JOIN CourseType courseType 
ON course.CourseTypeId = courseType.CourseTypeId 
GROUP BY course.CourseId 
HAVING COUNT(customers.CourseId) / courseType.MaxCustomers) * 100 <= 50

现在正在进行这项练习4个小时,似乎无法开始工作。关于如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:1)

尝试计数而不是Where:

SELECT course.CourseId, courseType.CourseName, course.Date, (COUNT(customers.CourseId) / courseType.MaxCustomers) * 100 as 'Fill in %' from Customers customers inner join Course course on customers.CourseId = course.CourseId inner join CourseType courseType on course.CourseTypeId = courseType.CourseTypeId group by course.CourseId Having COUNT(customers.CourseId) / courseType.MaxCustomers) * 100 <= 50

答案 1 :(得分:1)

您需要使用HAVING代替WHERE

此外,您必须在GROUP BY中添加所有列,而不使用aggregate功能。

试试这个:

SELECT course.CourseId,
         courseType.CourseName,
         course.Time,
         (COUNT (customers.CourseId) / courseType.MaxCustomers) * 100
            AS 'Fill in %'
    FROM Customers customers
    JOIN Course course ON customers.CourseId = course.CourseId
    JOIN CourseType courseType ON course.CourseTypeId = courseType.CourseTypeId
GROUP BY course.CourseId,courseType.CourseName,course.Time,courseType.MaxCustomers
HAVING COUNT(customers.CourseId) / courseType.MaxCustomers * 100 <= 50