有一个学生班级记录表
字段:机构编号、学生编号、学习状态(0在学;1毕业,2表示肄业) 加入班级时间 班级编号
我想求 2010年 每个机构中 所有参加某班级的总人数、在学人数、毕业人数、肄业人数 和毕业率 最好不要使用嵌套的SQL查询,这样的话在网页中使用这样的SQL语句 统计数据太慢了。 我编写的SQL语句如下: SELECT
A.Duty,
A.UserId as OrganId,
A.StudentNum,
--F.CreditHour,
IsNUll(Round(((F.CreditHour)*1.0/(A.StudentNum)*1.0),3),0) AS CreditHour,
IsNUll(B.StudentOverNum,0) AS StudentOverNum,
IsNull(C.StudentOnNum,0) AS StudentOnNum,
IsNull(D.StudentPassNum,0) AS StudentPassNum,
IsNull(Round(((B.StudentOverNum)*1.0/(A.StudentNum)*1.0),3)*100,0) AS StudyOverRate,
IsNull(E.StudyTime,0) AS StudyTime,
--IsNull(E.AvgStudyTime,0) AS AvgStudyTime,
IsNull(A.StudentNum-(B.StudentOverNum +C.StudentOnNum+D.StudentPassNum),0) AS DefereNum
FROM
--部门与总人数,平均学分
(SELECT
StudyClassStudentInfo.userID,
USERINFO.ActualName As Duty,
COUNT(StudyClassStudentInfo.StudentId) AS StudentNum,
AVG(StudyClassStudentInfo.CreditHour) AS CreditHour
FROM
StudyClassStudentInfo
INNER JOIN
USERINFO
ON
StudyClassStudentInfo.userid = userinfo.Id
WHERE
StudyClassStudentInfo.StudyClassId = @p_StudyClassId
AND
Year(StudyClassStudentInfo.JoinTime) = @p_Year
-- And StudyClassStudentInfo.UserId in ( select Id from UserInfo where id=
-- @p_CurrOrganId or ParentId=@p_CurrOrganId)
Group By USERINFO.ActualName,StudyClassStudentInfo.userID) A
LEFT JOIN
(
SELECT
USERINFO.ActualName AS Duty,
SUM(StudentCourseInfo.CreditHour*1.00) AS CreditHour
FROM
StudentCourseInfo
INNER JOIN
USERINFO
ON
StudentCourseInfo.USERID = USERINFO.Id
WHERE
StudentCourseInfo.CourseId in (SELECT CourseId FROM StudyClassCourseInfo WHERE StudyClassID=@p_StudyClassId)
-- And StudentCourseInfo.UserId in ( select Id from UserInfo where id=
-- @p_CurrOrganId or ParentId=@p_CurrOrganId)
GROUP BY USERINFO.ActualName
) F
ON
F.Duty = A.Duty
LEFT JOIN
--部门与结业人数
(SELECT
USERINFO.ActualName As Duty,
COUNT(StudyClassStudentInfo.Status) AS StudentOverNum
FROM
StudyClassStudentInfo
INNER JOIN
USERINFO
ON
StudyClassStudentInfo.USERID = USERINFO.Id
WHERE
StudyClassStudentInfo.StudyClassId = @p_StudyClassId
AND
StudyClassStudentInfo.Status = 1
AND
Year(StudyClassStudentInfo.JoinTime) = @p_Year --And StudyClassStudentInfo.UserId in ( select Id from UserInfo where id=
--@p_CurrOrganId or ParentId=@p_CurrOrganId)
Group By USERINFO.ActualName) B
ON
A.Duty = B.Duty
LEFT JOIN
--部门与在学人数
(SELECT
USERINFO.ActualName As Duty,
COUNT(StudyClassStudentInfo.Status) AS StudentOnNum
FROM
StudyClassStudentInfo
INNER JOIN
USERINFO
ON
StudyClassStudentInfo.USERID = USERINFO.Id
WHERE
StudyClassStudentInfo.StudyClassId = @p_StudyClassId
AND
StudyClassStudentInfo.Status = 0
AND
Year(StudyClassStudentInfo.JoinTime) = @p_Year
-- And StudyClassStudentInfo.UserId in ( select Id from UserInfo where id=
-- @p_CurrOrganId or ParentId=@p_CurrOrganId)
Group By USERINFO.ActualName) C
ON
A.Duty = C.Duty
LEFT JOIN
--部门与肄业人数
(SELECT
USERINFO.ACTUALNAME As Duty,
COUNT(StudyClassStudentInfo.Status) AS StudentPassNum
FROM
StudyClassStudentInfo
INNER JOIN
USERINFO
ON
StudyClassStudentInfo.USERID = USERINFO.Id
WHERE
StudyClassStudentInfo.StudyClassId = @p_StudyClassId
AND
StudyClassStudentInfo.Status = 2
AND
Year(StudyClassStudentInfo.JoinTime) = @p_Year
-- And StudyClassStudentInfo.UserId in ( select Id from UserInfo where id=
-- @p_CurrOrganId or ParentId=@p_CurrOrganId)
Group By USERINFO.ActualName) D
ON
A.Duty = D.Duty LEFT JOIN
--部门与总学时,平均学时
(SELECT
USERINFO.ACTUALNAME As Duty,
ISNULL(SUM(DateDiff(minute,StudentCourseLog.BeginTime,StudentCourseLog.EndTime)),0) AS StudyTime
FROM
StudentCourseLog
INNER JOIN
USERINFO
ON
StudentCourseLog.USERID = USERINFO.Id
WHERE CourseId in
(
SELECT
CourseId
FROM
StudyClassCourseInfo
WHERE
StudyClassid = @p_StudyClassId
)
AND
Year(StudentCourseLog.BeginTime) = @p_Year
-- And StudentCourseLog.UserId in ( select Id from UserInfo where id=
-- @p_CurrOrganId or ParentId=@p_CurrOrganId)
GROUP By USERINFO.ActualName) E
ON
A.Duty = E.Duty 这个SQL语句的执行速度太慢了 那位大大有没有更好的办法。。
没个机构可能会有下级机构 我想求的是 机构的学生的总数包括下级机构中的学生 。。
请各位大神不吝赐教。
字段:机构编号、学生编号、学习状态(0在学;1毕业,2表示肄业) 加入班级时间 班级编号
我想求 2010年 每个机构中 所有参加某班级的总人数、在学人数、毕业人数、肄业人数 和毕业率 最好不要使用嵌套的SQL查询,这样的话在网页中使用这样的SQL语句 统计数据太慢了。 我编写的SQL语句如下: SELECT
A.Duty,
A.UserId as OrganId,
A.StudentNum,
--F.CreditHour,
IsNUll(Round(((F.CreditHour)*1.0/(A.StudentNum)*1.0),3),0) AS CreditHour,
IsNUll(B.StudentOverNum,0) AS StudentOverNum,
IsNull(C.StudentOnNum,0) AS StudentOnNum,
IsNull(D.StudentPassNum,0) AS StudentPassNum,
IsNull(Round(((B.StudentOverNum)*1.0/(A.StudentNum)*1.0),3)*100,0) AS StudyOverRate,
IsNull(E.StudyTime,0) AS StudyTime,
--IsNull(E.AvgStudyTime,0) AS AvgStudyTime,
IsNull(A.StudentNum-(B.StudentOverNum +C.StudentOnNum+D.StudentPassNum),0) AS DefereNum
FROM
--部门与总人数,平均学分
(SELECT
StudyClassStudentInfo.userID,
USERINFO.ActualName As Duty,
COUNT(StudyClassStudentInfo.StudentId) AS StudentNum,
AVG(StudyClassStudentInfo.CreditHour) AS CreditHour
FROM
StudyClassStudentInfo
INNER JOIN
USERINFO
ON
StudyClassStudentInfo.userid = userinfo.Id
WHERE
StudyClassStudentInfo.StudyClassId = @p_StudyClassId
AND
Year(StudyClassStudentInfo.JoinTime) = @p_Year
-- And StudyClassStudentInfo.UserId in ( select Id from UserInfo where id=
-- @p_CurrOrganId or ParentId=@p_CurrOrganId)
Group By USERINFO.ActualName,StudyClassStudentInfo.userID) A
LEFT JOIN
(
SELECT
USERINFO.ActualName AS Duty,
SUM(StudentCourseInfo.CreditHour*1.00) AS CreditHour
FROM
StudentCourseInfo
INNER JOIN
USERINFO
ON
StudentCourseInfo.USERID = USERINFO.Id
WHERE
StudentCourseInfo.CourseId in (SELECT CourseId FROM StudyClassCourseInfo WHERE StudyClassID=@p_StudyClassId)
-- And StudentCourseInfo.UserId in ( select Id from UserInfo where id=
-- @p_CurrOrganId or ParentId=@p_CurrOrganId)
GROUP BY USERINFO.ActualName
) F
ON
F.Duty = A.Duty
LEFT JOIN
--部门与结业人数
(SELECT
USERINFO.ActualName As Duty,
COUNT(StudyClassStudentInfo.Status) AS StudentOverNum
FROM
StudyClassStudentInfo
INNER JOIN
USERINFO
ON
StudyClassStudentInfo.USERID = USERINFO.Id
WHERE
StudyClassStudentInfo.StudyClassId = @p_StudyClassId
AND
StudyClassStudentInfo.Status = 1
AND
Year(StudyClassStudentInfo.JoinTime) = @p_Year --And StudyClassStudentInfo.UserId in ( select Id from UserInfo where id=
--@p_CurrOrganId or ParentId=@p_CurrOrganId)
Group By USERINFO.ActualName) B
ON
A.Duty = B.Duty
LEFT JOIN
--部门与在学人数
(SELECT
USERINFO.ActualName As Duty,
COUNT(StudyClassStudentInfo.Status) AS StudentOnNum
FROM
StudyClassStudentInfo
INNER JOIN
USERINFO
ON
StudyClassStudentInfo.USERID = USERINFO.Id
WHERE
StudyClassStudentInfo.StudyClassId = @p_StudyClassId
AND
StudyClassStudentInfo.Status = 0
AND
Year(StudyClassStudentInfo.JoinTime) = @p_Year
-- And StudyClassStudentInfo.UserId in ( select Id from UserInfo where id=
-- @p_CurrOrganId or ParentId=@p_CurrOrganId)
Group By USERINFO.ActualName) C
ON
A.Duty = C.Duty
LEFT JOIN
--部门与肄业人数
(SELECT
USERINFO.ACTUALNAME As Duty,
COUNT(StudyClassStudentInfo.Status) AS StudentPassNum
FROM
StudyClassStudentInfo
INNER JOIN
USERINFO
ON
StudyClassStudentInfo.USERID = USERINFO.Id
WHERE
StudyClassStudentInfo.StudyClassId = @p_StudyClassId
AND
StudyClassStudentInfo.Status = 2
AND
Year(StudyClassStudentInfo.JoinTime) = @p_Year
-- And StudyClassStudentInfo.UserId in ( select Id from UserInfo where id=
-- @p_CurrOrganId or ParentId=@p_CurrOrganId)
Group By USERINFO.ActualName) D
ON
A.Duty = D.Duty LEFT JOIN
--部门与总学时,平均学时
(SELECT
USERINFO.ACTUALNAME As Duty,
ISNULL(SUM(DateDiff(minute,StudentCourseLog.BeginTime,StudentCourseLog.EndTime)),0) AS StudyTime
FROM
StudentCourseLog
INNER JOIN
USERINFO
ON
StudentCourseLog.USERID = USERINFO.Id
WHERE CourseId in
(
SELECT
CourseId
FROM
StudyClassCourseInfo
WHERE
StudyClassid = @p_StudyClassId
)
AND
Year(StudentCourseLog.BeginTime) = @p_Year
-- And StudentCourseLog.UserId in ( select Id from UserInfo where id=
-- @p_CurrOrganId or ParentId=@p_CurrOrganId)
GROUP By USERINFO.ActualName) E
ON
A.Duty = E.Duty 这个SQL语句的执行速度太慢了 那位大大有没有更好的办法。。
没个机构可能会有下级机构 我想求的是 机构的学生的总数包括下级机构中的学生 。。
请各位大神不吝赐教。
解决方案 »
- 客户端怎样存取sqlserver服务器电脑上的文件夹中的图片?
- 请教一条SQL
- 高手帮忙写一条sql语句!
- Windows Server 2003 简体中文标准版上能不能安装SQLserver2000企业版啊?
- 在SQL运行出错?
- 第一次来CSDN请教一个简单问题,希望大家指教
- 在SQL里如何检测某个表在数据库中已经存在?
- 存储过程报错[必须声明标量变量 "@RowCount"]
- 如何再存储过程中通过参数动态创建数据库?
- 请问哪有存储过程学习的相关资料?
- 使用内置函数实现类似带参视图功能,然后进行行列互转的存储过程,为什么错?(sql server 2000下)
- sql server2000如何创建带参数的视图?在存储过程中建视图参数传不进?
试试:
select 机构编号,班级编号,count(*)as 班级总人数 from 学生班级记录表 where 加入班级时间='2010' group by 机构编号,班级编号
select 机构编号,班级编号,count(*)as 在学人数 from 学生班级记录表 where 加入班级时间='2010' and 学习状态=0 group by 机构编号,班级编号
select 机构编号,班级编号,count(*)as 毕业人数 from 学生班级记录表 where 加入班级时间='2010' and 学习状态=1 group by 机构编号,班级编号
select 机构编号,班级编号,count(*)as 肄业人数 from 学生班级记录表 where 加入班级时间='2010' and 学习状态=2 group by 机构编号,班级编号
select 机构编号,班级编号,sum((case when 学习状态=1 then 1 else 0 end))/sum((case when 学习状态=1 or 学习状态=2 then 1 else 0 end)) as 毕业率 from 学生班级记录表 where 加入班级时间='2010' group by 机构编号,班级编号
http://topic.csdn.net/u/20101214/10/84a2d1a3-1750-49f1-821b-2f3c5836db21.html?90869
CREATE PROCEDURE getmanythings
(
@year nvarchar(4),
@jgbh int,
@bjbh int,
@bjzrs int output,
@zxrs int output,
@byrs int output,
@yyrs int output,
@byr decimal(18,4) output
)
as
begin
select @bjzrs=count(*) from 学生班级记录表 where 加入班级时间=@year and 机构编号=@jgbh and 班级编号=bjbh
select @zxrs=count(*) from 学生班级记录表 where 加入班级时间=@year and 机构编号=@jgbh and 班级编号=bjbh and 学习状态=0
select @byrs=count(*) from 学生班级记录表 where 加入班级时间=@year and 机构编号=@jgbh and 班级编号=bjbh and 学习状态=1
select @yyrs=count(*) from 学生班级记录表 where 加入班级时间=@year and 机构编号=@jgbh and 班级编号=bjbh and 学习状态=2
set @byr=1.0000*@byrs/(@byrs+@yyrs)
end
go