76 lines
2.4 KiB
Python
76 lines
2.4 KiB
Python
from pygments.lexers import sql
|
|
from sentry_sdk.integrations import sqlalchemy
|
|
|
|
from StatCalc.schema.statcalc_request import *
|
|
from fastapi import HTTPException
|
|
from sqlalchemy import *
|
|
|
|
|
|
from students.model.students_model import Students
|
|
|
|
def get_age_30(db):
|
|
q = db.query(Students).filter(Students.age>=30).all()
|
|
return q
|
|
|
|
|
|
from class_management.model.class_management_model import ClassInfo
|
|
|
|
def get_class_count(g , db):
|
|
if g == "班级人数":
|
|
q = (db.query(ClassInfo.id,ClassInfo.name,func.count(ClassInfo.id).label('count') )
|
|
.join(Students,Students.class_id==ClassInfo.id)
|
|
.group_by(ClassInfo.id,ClassInfo.name,Students.sex)
|
|
.all())
|
|
elif g == "男女人数":
|
|
q = (db.query(Students.sex, func.count(Students.id).label('count'))
|
|
.group_by(Students.sex)
|
|
.all())
|
|
elif g == "班级中男女人数":
|
|
q = (db.query(ClassInfo.id,ClassInfo.name,Students.sex,func.count(ClassInfo.id).label('count') )
|
|
.join(Students,Students.class_id==ClassInfo.id)
|
|
.group_by(ClassInfo.id,ClassInfo.name,Students.sex)
|
|
.all())
|
|
else:
|
|
return False
|
|
return [row._asdict() for row in q]
|
|
|
|
|
|
from scores.model.score_model import Score
|
|
|
|
def get_score_80(db):
|
|
sq = ( db.query(Students.id)
|
|
.join(Score, Score.sid == Students.id)
|
|
.filter(Score.score < 80 )
|
|
.group_by(Students.id)
|
|
.having(func.count(Score.id) > 2 )
|
|
.all()
|
|
)
|
|
|
|
q = ( db.query(Students.name,ClassInfo.name,Score.score )
|
|
.join(ClassInfo, ClassInfo.id == Students.class_id)
|
|
.join(Score, Score.sid == Students.id)
|
|
.filter(Students.id.in_(sq),Score.score < 80)
|
|
.all()
|
|
)
|
|
return [row._asdict() for row in q]
|
|
|
|
def get_class_avg_dao(db):
|
|
results = (db.query(Score.num,
|
|
Score.cid,
|
|
ClassInfo.name.label("class_name"),
|
|
func.avg(Score.score).label("avg_score"))
|
|
.join(ClassInfo, Score.cid == ClassInfo.id)
|
|
.filter(Score.is_deleted == 0)
|
|
.group_by(Score.num, Score.cid, ClassInfo.name)
|
|
.order_by(func.avg(Score.score).desc())
|
|
.all())
|
|
|
|
return [ {"num": r.num,
|
|
"cid": r.cid,
|
|
"class_name": r.class_name,
|
|
"avg_score": round(float(r.avg_score), 2),}
|
|
for r in results]
|
|
|
|
|
|
|