【问题标题】:How do I write a SQL query to display course_id, course_name and fee collected from each course?如何编写 SQL 查询来显示每门课程收取的 course_id、course_name 和费用?
【发布时间】:2017-07-07 14:58:56
【问题描述】:

各种表格及其列是:

1)课程

course_id
course_name
duration
fee

2)注册

course_id
stud_id
doj

3)学生

stud_id
first_name
last name
city
dob

我试过了:

SELECT 
    C.COURSE_ID,
    C. COURSE_NAME, 
    COUNT(R.COURSE_ID) * FEES AS TOTAL_FEES 
FROM 
    COURSE C, 
    REGISTRATION R, 
WHERE 
    C.COURSE_ID = R.COURSE_ID 
GROUP BY 
    R.COURSE_ID

【问题讨论】:

  • 这听起来像是一道作业题。 -- 作为记录,查询中的每个非聚合字段都需要在 Group By 语句中明确说明,即使它不会产生影响。所以你的查询甚至不会按原样运行。
  • 我需要为每门课程收取费用。一个课程有很多注册。例如,一门名为 xyz 的课程,其费用为 5000,并且有 8 名学生注册了 xyz 课程。所以我需要 8*5000 作为 xyz 课程的 total_fee 的答案
  • 那么您应该在问题中提到这一点。包括表之间的关系很重要。一对一,一对多,主键......等

标签: mysql sql database join relational-database


【解决方案1】:
SELECT c.cource_id, c.course_name, (totalNumberOfStudentPerCourse.totalNumberOfStudent * c.fee) as totalFee
FROM Course c
INNER JOIN 
        (SELECT r.course_id, COUNT(r.stud_id) as totalNumberOfStudent
        FROM Registration r
        GROUP BY r.course_id) totalNumberOfStudentPerCourse ON c.course_id =  totalNumberOfStudentPerCourse.course_id 

子查询创建一个如下所示的 totalNumberOfStudentPerCourse 表:

course_id     totalNumberOfStudent
1             4
2             2

示例:

课程:

course_id  course_name  fee

1           math         300
2           english      200

注册:

course_id    stud_id
1             1
1               2
1               3
1               4
2               5
2               6

结果:

course_id   course_name     totalFee
1           math            1200
2           english         400

【讨论】:

    【解决方案2】:

    您可以在 group by 查询上使用 select,然后将其与 course 表连接以使用其其余字段。

    SELECT aa.course_id, aa.course_name, aa.fee * _aa.total_registrations AS total_fees
    FROM course AS aa
    LEFT JOIN (
        SELECT course_id, COUNT(*) as total_registrations
        FROM registration
        GROUP BY course_id
    ) AS _aa
    ON aa.course_id = _aa.course_id
    ORDER BY aa.course_name ASC
    

    【讨论】:

      【解决方案3】:
          select c.courseid, c.coursename, c.fees * aa.tr as TOTALFEES
          from course c 
          LEFT JOIN (
                select courseid,COUNT(*) as tr
                from registration 
                group by courseid
          ) aa
          ON c.courseid = aa.courseid
          order by c.courseid;
      

      【讨论】:

      • 您能否详细说明您的答案?
      • 这与几年前的另一个答案相比有一些细微的变化。
      【解决方案4】:
      select courseid,coursename,(tsp_course.totalstd * c.fees) as TOTALFEES
       from course c 
       inner join(select r.courseid,count(r.courseid) as totalstd
                  from registration r
                  group by r.courseid) tsp_course using(courseid)
       order by courseid;
      

      【讨论】:

        【解决方案5】:

        这就是你要找的东西:

        Select course.course_id,course.course_name,(count(reg.stud_id)*course.fee)  
        From Course course INNER JOIN Registration reg  
        ON course.course_id=reg.course_id  
        GROUP BY  course.course_id,course.course_name,course.fee
        

        【讨论】:

        • 如果需要,请按 course.course_name 顺序在最后添加一行;
        猜你喜欢
        • 1970-01-01
        • 2014-06-14
        • 2018-08-10
        • 2013-07-09
        • 1970-01-01
        • 2011-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多