34,837
社区成员




USE tempdb
GO
SET NOCOUNT ON
-- 示例数据
IF OBJECT_ID('a') IS NOT NULL
DROP TABLE a
CREATE TABLE a(
考试科目 nvarchar(10),
考试类型 nvarchar(10),
作业套数 int)
INSERT INTO a VALUES ('大学语文','课程作业','3')
INSERT INTO a VALUES ('大学英语','课程作业+课程论文','5')
INSERT INTO a VALUES ('管理学','集中考试','0')
INSERT INTO a VALUES ('会计','集中考试+课程作业','7')
IF OBJECT_ID('b') IS NOT NULL
DROP TABLE b
CREATE TABLE b(
考试科目 nvarchar(10),
作业成绩 int,
作业名称 nvarchar(10),
学生用户名 nvarchar(10))
INSERT INTO b VALUES ('大学语文','90','大学语文第一次作业','friendly')
INSERT INTO b VALUES ('大学语文','90','大学语文第二次作业','friendly')
INSERT INTO b VALUES ('大学语文','100','大学语文第三次作业','friendly')
INSERT INTO b VALUES ('大学语文','60','大学语文第四次作业','friendly')
INSERT INTO b VALUES ('大学语文','0','大学语文第五次作业','friendly')
INSERT INTO b VALUES ('大学英语','90','大学英语第一次作业','xxxxxx')
INSERT INTO b VALUES ('大学英语','80','大学英语第二次作业','xxxxxx')
GO
-- 计算(使用临时表的方式, 一般大数据量的话, 建议用辅助列)
-- a. 临时表
SELECT
ID = IDENTITY(int, 1, 1),
a.考试科目, a.考试类型, b.学生用户名,
a.作业套数, b.作业成绩,
sortid = 0
INTO #
FROM a, b
WHERE A.考试科目 = B.考试科目
ORDER BY a.考试科目, a.考试类型, b.学生用户名
ALTER TABLE # ADD
PRIMARY KEY(
id)
CREATE INDEX IX_ALL
ON #(
考试科目, 考试类型, 学生用户名, 作业成绩 DESC)
-- b. 生成序号
DECLARE
@sortid int,
@考试科目 nvarchar(10),
@考试类型 nvarchar(10),
@学生用户名 nvarchar(10)
UPDATE A SET
@sortid = CASE
WHEN @考试科目 = 考试科目 AND @考试类型 = 考试类型 AND @学生用户名 = 学生用户名
THEN @sortid + 1
ELSE 1 END,
@考试科目 = 考试科目,
@考试类型 = 考试类型,
@学生用户名 = 学生用户名,
sortid = @sortid
FROM # A WITH(INDEX(IX_ALL))
-- 计算成绩
SELECT
考试科目, 考试类型, 学生用户名,
作业成绩 = SUM(作业成绩) / MAX(作业套数)
FROM #
WHERE sortid <= 作业套数
GROUP BY 考试科目, 考试类型, 学生用户名
DROP TABLE #
GO
-- 删除示例
DROP TABLE a, b
INSERT INTO a VALUES ('大学语文','课程作业','3')
INSERT INTO a VALUES ('大学英语','课程作业+课程论文','5')
INSERT INTO a VALUES ('管理学','集中考试','0')
INSERT INTO a VALUES ('会计','集中考试+课程作业','7')
INSERT INTO b VALUES ('大学语文','90','大学语文第一次作业','friendly')
INSERT INTO b VALUES ('大学语文','90','大学语文第二次作业','friendly')
INSERT INTO b VALUES ('大学语文','100','大学语文第三次作业','friendly')
INSERT INTO b VALUES ('大学语文','60','大学语文第四次作业','friendly')
INSERT INTO b VALUES ('大学语文','0','大学语文第五次作业','friendly')
INSERT INTO b VALUES ('大学英语','90','大学英语第一次作业','xxxxxx')
INSERT INTO b VALUES ('大学英语','80','大学英语第二次作业','xxxxxx')
INSERT INTO b VALUES ('大学英语','0','大学英语第三次作业','xxxxxx')