如何重组多个表中的数据

问题描述 投票:0回答:1

我有两张表,其中包含有关课程的相关数据,以及构成这些课程的考试和课程作业。这些表称为 tblCourses 和 tblCourseComponents,结构如下:

CREATE TABLE tblCourses (
CourseID INT IDENTITY PRIMARY KEY,
CourseName VARCHAR(300)
)

CREATE TABLE tblCourseComponents (
ExamID INT IDENTITY PRIMARY KEY,
ComponentName VARCHAR(300),
CourseID INT FOREIGN KEY REFERENCES tblCourses.CourseID
)

一门课程可能有 1 个或多个组件 - 目前不超过 4 个组件,但这可能会改变。

数据可能如下所示:

INSERT INTO tblCourses (CourseName)
VALUES ('Course A'), ('Course B'), ('Course C')

INSERT INTO tblCourseComponents (ComponentName, CourseID)
VALUES ('Course A Exam 1',1),
('Course A Exam 2',1),
('Course B Exam 1',2),
('Course C Exam 1',3),
('Course C Exam 2',3),
('Course C Coursework 1',3)

学生参加 tblCourseComponents 中指定的考试/课程作业,并在每个组件中获得分数。类似地,他们获得了整个课程的分数,虽然理论上是各部分分数的加权平均值,但它可以变化,因此是单独存储的。每个学生都由唯一的考生 ID (CID) 来识别。

所以,有一个表格来记录课程分数:

CREATE TABLE tblStudentScoreHistory
(ScoreID INT IDENTITY PRIMARY KEY,
CID VARCHAR(8),
CourseID INT FOREIGN KEY REFERENCES tblCourses(CourseID),
UnitMark DECIMAL (8,6),
ModeratedScore DECIMAL (8,6)
)

还有一个记录元件标记的表格:

CREATE TABLE tblStudentComponentInformation (
ID INT IDENTITY PRIMARY KEY,
RelatedScoreID INT FOREIGN KEY REFERENCES tblStudentScoreHistory,
ExamID INT FOREIGN KEY REFERENCES tblCourseComponents (lngExamID),
CID VARCHAR(8),
ComponentScorePercent DECIMAL(8,6),
ModeratedComponentScorePercent DECIMAL(8,6)
)

请注意,上述两个表格均包括每个学生的两个分数 - 一个分数和一个“适度”分数,这是由考官委员会根据情有可原的情况进行调整的分数。两列始终都会被填充,但在大多数情况下,经过审核的标记与未经审核的标记相同。

我被要求制作一份数据报告。这个想法是提供课程代码,并且输出应该有一列用于每个组件的标记和未经审核的标记(因此,如果有 3 个组件,则为 6 列,但如果只有一个组件,则为两列)加上一栏用于课程未审核分数,一栏用于课程审核分数。 Example of required report layout

我一直在尝试使用 Pivots 和 CASE 表达式,但不知道如何做到这一点。

感谢您的帮助。

sql sql-server
1个回答
0
投票

使用 在 SQL Server 中如何透视多列的建议 我根据您的表格描述构建了这个示例。

WITH Scores as
(  
SELECT SSH.CID, CC.CourseID, CC.CourseID *10 as CourseID2, ComponentName, ComponentScorePercent, ModeratedComponentScorePercent
FROM tblCourseComponents CC
INNER JOIN tblStudentScoreHistory SSH on SSH.CourseID=CC.CourseID  
INNER JOIN  tblStudentComponentInformation SCI ON SSH.CID= SCI.CID
)
-- Pivot table with one row and five columns  
SELECT CID, [0] AS [Course A Exam 1 unmod mark], [10] AS [Course A Exam 1 mod mark],
  [1]  AS [Course A Exam 2 unmod mark], [11] AS [Course A Exam 2 mod mark], 
  [2] AS [Course B Exam 1 unmod mark], [12] AS [Course B Exam 1 mod mark], 
  [3] AS [Course C Exam 1 unmod mark], [13] AS [Course C Exam 1 mod mark], 
  [4] AS [Course C Exam 2 unmod mark], [14] AS [Course C Exam 2 mod mark],
  [5] AS [Course C Exam 3 unmod mark], [14] AS [Course C Exam 3 mod mark]
FROM  
Scores
PIVOT  -- For ComponentScorePercent AVG
(  
  AVG(ComponentScorePercent)  
  FOR CourseID IN ([0], [1], [2], [3], [4], [5])  
) AS Pv1
PIVOT  -- For ModeratedComponentScorePercent AVG
(
   AVG(ModeratedComponentScorePercent)
   FOR CourseID2 IN  ([10], [11], [12], [13], [14], [15])  
) AS pv2

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.