【SQL】求统计查询的SQL语句 80C

有学生评分表,字段有:ID,班级,学生,学科,教师,A1,A2,A3,A4,B1,B2,B3,B4,C1,C2,C3,C4,D1,D2,D3,D4

由不同学科的教师对 A1-A4,B1-B4,C1-C4,D1-D4 作评分,分值为 1-4分,代表四个等级。

现要统计出每个学生在 A1-A4,B1-B4,C1-C4,D1-D4 各项中每个等级的个数,即得 1 分有几个,得 2 分的有几个,得 3 分的有几个,得 4 分的有几个。

求 SQL 语句,定重谢。

===== 4 月 9 日下午 4 点补充说明 =====

该评分表实际上为学生综合素质评分表。学生的综合素质评价分为 A,B,C,D 四个大类,下面分别有四个小类,即,A 类有 A1-A4,B 类有 B1-B4,C 类有 C1-C4,D 类有 D1-D4。教师要分给给这个十六个小类分别评分,分值为 1-4 分,也可以留空不评。如图:

学生综合素质评分表

现在是想得到每个学生在这十六个小类中得 1 分的几个,得 2 分的几个,得 3 分的几个,得 4 分的几个。如图:

图片说明

sql

15个回答

问题简化:您陈述的这个问题应该细化一下,比如:一个教师(确定下来)对应全部学生。(这个是前提)。统计每个学生在A1-A4,B1-B4,C1-C4,D1-D4 各项中得 1 分有几个,得 2 分的有几个,得 3 分的有几个,得 4 分的有几个。

然后设计一个针对这个问题的表,再做统计就简单了。

具体做法如下:
第一步:比如一个数学教师,对每个学生评分的表。统计每个学生在A1-A4,B1-B4,C1-C4,D1-D4 各项中得 1 分有几个,得 2 分的有几个,得 3 分的有几个,得 4 分的有几个。
第二步:用MySQL查询语句查询A1=1的有几人:SELECT SUM(A1) AS A1_total1 FROM 表 WHERE A1=1;
用MySQL查询语句查询A1=2的有几人:SELECT SUM(A1) AS A1_total2 FROM 表 WHERE A1=2;
用MySQL查询语句查询A1=3的有几人:SELECT SUM(A1) AS A1_total3 FROM 表 WHERE A1=3;
......
用MySQL查询语句查询D1=4的有几人:SELECT SUM(D4) AS D4_total4 FROM 表 WHERE D4=4;

SELECT * FROM (SELECT ID,A1,A2,A3,A4 FROM 评分表 GROUP BY ID,A1,A2,A3,A4 ) A UNION
SELECT * FROM (SELECT ID,B1,B2,B3,B4 FROM 评分表 GROUP BY ID,B1,B2,B3,B4 ) B UNION
SELECT * FROM (SELECT ID,C1,C2,C3,C4 FROM 评分表 GROUP BY ID,C1,C2,C3,C4 ) C UNION
SELECT * FROM (SELECT ID,D1,D2,D3,D4 FROM 评分表 GROUP BY ID,D1,D2,D3,D4 ) D
生成四条记录,每条记录是一项评分:比如,思品,科学,体育,美术。

A1~A4每个都要评分,还是说A1就是1分,A2就是2分;A,B,C,D代表4个科目?每个科目教师为一个元组?一个学生需要4个元组。

如果统计 A1,则 select A1,count(id) from 学生评分表 group by A1;
其他以此类推。

这个表设计的真坑爹啊,业务主键应该是学生+学科+老师吧?(正常情况下一个学科只能一个老师,不过我读书的时候有其他老师代课的情况,得看需求是否到老师的维度,如果不到只关心学生+学科即可)
SQL如下:

create table testxzq (bnid varchar2(50),
classnum int,studentid varchar2(50),sourceid varchar2(50),teacherid varchar2(50),
A1 number,A2 number ,B1 number,B2 number,c1 number ,c2 number
);

select t.studentid,t.sourceid,
sum(nvl(t.a1,0)+nvl(t.a2,0)) A,sum(nvl(t.b1,0) + nvl(t.b2,0)) B,sum(nvl(t.c1,0)+nvl(t.c2,0)) C
from testxzq t
group by t.studentid,t.sourceid;

topshow_2010
topshow_2010 这个是取分数的第一步,然后根据分数分段取各个分数的人数
一年多之前 回复

select sid,(count(A1) + count(A2) + count(A3) + count(A4)) as a , (count(B1) + count(B2) + count(B3) + count(B4)) as b,(count(C1) +count(C2) + count(C3) + count(C4)) as c , (count(D1) + count(D2) + count(D3) + count(D4)) as d from table

select d.sourceid,
sum(case when d.a = 1 then 1 else 0 end ) A1,
sum(case d.a when 2 then 1 else 0 end ) A2,
sum(case d.a when 3 then 1 else 0 end ) A3,
sum(case d.a when 4 then 1 else 0 end ) A4,
sum(case d.b when 1 then 1 else 0 end ) B1,
sum(case d.b when 2 then 1 else 0 end ) B2,
sum(case d.b when 3 then 1 else 0 end ) B3,
sum(case d.b when 4 then 1 else 0 end ) B4,
sum(case d.c when 1 then 1 else 0 end ) C1,
sum(case d.c when 2 then 1 else 0 end ) C2,
sum(case d.c when 3 then 1 else 0 end ) C3,
sum(case d.c when 4 then 1 else 0 end ) C4
from (
select t.studentid,t.sourceid,
sum(nvl(t.a1,0)+nvl(t.a2,0)) a,sum(nvl(t.b1,0) + nvl(t.b2,0)) b,sum(nvl(t.c1,0)+nvl(t.c2,0)) c
from testxzq t
group by t.studentid,t.sourceid
) d group by d.sourceid
;

Msln1995
Msln1995 如果是总和就是sum 如果是数量就是count
一年多之前 回复
Msln1995
Msln1995 sum 还是count?
一年多之前 回复

if (object_id('tgr_update', 'TR') is not null)

drop trigger tgr_update
go
create trigger tgr_clasupdate' B

for update
as

declare @A1 int, @newB1 int;
--更新前的数据

select @oldnewB1=b1,@A1=a1 From inserted

if (@olnewB1==1)

begin
--更新后的数据

update A set A2= 1 where A1 = @A1

end

go

需求没描述清楚,可以使用case when条件语句和group by结合筛选查询

--表名: b_test,假设A1-D4字段类型是字符如果是数字则先转字符,并且不会为空如果为空则去空为0
--SQL思路就是先将每条评分记录连成字符串,再从中取各评分字符的出现次数,最后将不同教师不同评分个数合计

select 班级,学生,SUM(LENGTHB(TRANSLATE(合计,'1'||合计,'1'))) 1分个数,
SUM(LENGTHB(TRANSLATE(合计,'2'||合计,'2'))) 2分个数,
SUM(LENGTHB(TRANSLATE(合计,'3'||合计,'3'))) 3分个数,
SUM(LENGTHB(TRANSLATE(合计,'4'||合计,'4'))) 4分个数
from (select 班级,学生,学科,教师,A1||A2||A3||A4||B1||B2||B3||B4||C1||C2||C3||C4||D1||D2||D3||D4 合计 from b_test )
group by 班级,学生

NET_NDSC_WZP
NET_NDSC_WZP 这个是ORACLE 语法的写法,如果是其他数据库可以按上面的思路修改SQL
一年多之前 回复
共15条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!