SQL Pivot课程中注册学生的成绩

时间:2017-11-20 15:11:36

标签: sql pivot oracle-sqldeveloper

我在SQL中有以下结果数据表(大约有200行我不共享):

DEPT     COURSE#    COURSE NAME             QTY ENROLLED   GRADE
----    --------    -------------           ------------   -----
ACCT    ACCT2220    ACCOUNTING II           50              B
ACCT    ACCT2220    ACCOUNTING II           36              C
ACCT    ACCT2220    ACCOUNTING II           2               D
ACCT    ACCT2220    ACCOUNTING II           9               F
CHEM    CHEM2001    INTRO TO CHEMISTRY      17              A
CHEM    CHEM2001    INTRO TO CHEMISTRY      50              B
CHEM    CHEM2001    INTRO TO CHEMISTRY      36              C
COSC    COSC1310    INTRO TO COMPUTER SCI   50              B
COSC    COSC1310    INTRO TO COMPUTER SCI   36              C

我想绕过它,以便它看起来类似于下面的内容:

DEPT  COURSE#     COURSE NAME   A    B    C   D   F
----  -------   ------------- ---  ---  --- --- ---
ACCT  ACCT2220  ACCOUNTING II   0   50   36  2    9
CHEM  CHEM2001  INTRO TO CHEM   17  50   36  0    0
COSC  COSC1310  INTRO TO COMP   0   50   36  0    0

我当前的查询(凌乱):

SELECT
course.offering_dept, course.course_number, course.course_name,
count(grade_report.student_number), grade_report.grade

FROM
eb.course,
eb.grade_report JOIN eb.section ON grade_report.section_id = 
section.section_id

GROUP BY
course.offering_dept, course.course_number, course.course_name, 
grade_report.grade

ORDER BY
course.course_number;

我似乎无法弄清楚从哪里开始。每次我使用PIVOT,没有任何运行,我有错误说无效标识符。任何想法或建议都表示赞赏。

1 个答案:

答案 0 :(得分:0)

如果您使用的是Sql Server

,这是使用Pivot的一种方法
SELECT course.offering_dept,
        course.course_number,
        course.course_name,
        [A],[B],[C],[D],[F]
FROM   eb.course,
        eb.grade_report
        JOIN eb.section
            ON grade_report.section_id = section.section_id
PIVOT (Count(grade_report.student_number)
        FOR GRADE IN ([A],[B],[C],[D],[F])) pv 

其他

SELECT course.offering_dept,
       course.course_number,
       course.course_name,
       sum(CASE WHEN GRADE = 'A' THEN 1 ELSE 0 END) as 'A',
       sum(CASE WHEN GRADE = 'B' THEN 1 ELSE 0 END) as 'B',
       sum(CASE WHEN GRADE = 'C' THEN 1 ELSE 0 END) as 'C',
       sum(CASE WHEN GRADE = 'D' THEN 1 ELSE 0 END) as 'D',
       sum(CASE WHEN GRADE = 'F' THEN 1 ELSE 0 END) as 'F'
FROM   eb.course,
       eb.grade_report
       JOIN eb.section
         ON grade_report.section_id = section.section_id
GROUP  BY course.offering_dept,
          course.course_number,
          course.course_name
ORDER  BY course.course_number;