如何使用sql

时间:2015-07-28 12:21:42

标签: sql-server tsql

我必须找到所有有超过33分的学生,但似乎找不到特定科目中少于33分的学生......!

SELECT DISTINCT tbl_Users.strfname + ' ' + tbl_Users.strlname AS 'Teacher Name'
,      tbl_Subject.strSubject                                 AS Subject
,      tbl_Subject.strCourseCode                              AS 'Course Code'
,      tbl_Class.strClass                                     AS Class 
,      COUNT(CAST(tbl_Result_1.strObtMarks AS float) / CAST(tbl_Result_1.strTotalMarks AS float) * 100) AS Pass
FROM   tbl_Users 
       INNER JOIN tbl_Result AS tbl_Result_1 
       INNER JOIN tbl_Class 
       INNER JOIN tbl_TeacherSubject ON tbl_Class.nc_id = tbl_TeacherSubject.nc_id ON tbl_Result_1.nc_id = tbl_Class.nc_id ON tbl_Users.nu_id = tbl_Result_1.nu_id 
       INNER JOIN tbl_Subject ON tbl_Result_1.nsbj_id = tbl_Subject.nsbj_id
WHERE (tbl_Users.nsch_id = @sch) 
  AND (tbl_Class.nsch_id = @sch) 
  AND (tbl_Subject.nsch_id = @sch) 
  AND (CAST(tbl_Result_1.strObtMarks AS float) / CAST(tbl_Result_1.strTotalMarks AS float) * 100 >=
                            (SELECT CAST(strPercentage AS float) AS Expr1
                             FROM   tbl_Percentage AS tbl_Percentage_1
                             WHERE  (nsch_id = @sch))) 
  AND (tbl_Result_1.bisDeleted = @fbit) 
  AND (tbl_Class.bisDeleted = @fbit) 
  AND (tbl_TeacherSubject.bisDeleted = @fbit) 
  AND (tbl_Users.bisDeleted = @fbit) 
  AND (tbl_Subject.bisDeleted = @fbit) 
  AND (tbl_TeacherSubject.nsch_id = @sch) 
  AND (tbl_Result_1.nsch_id = @sch) 
  AND (tbl_Result_1.nExam_id = @exam) 
  AND (tbl_Result_1.nsbj_id = @sub) 
  AND (SUBSTRING(tbl_Result_1.dtAddDate, 7, 4) = @txtdate)
GROUP BY tbl_Users.strfname, tbl_Users.strlname, tbl_Subject.strSubject, tbl_Subject.strCourseCode, tbl_Class.strClass, tbl_TeacherSubject.nsch_id, tbl_Result_1.nsch_id, tbl_Result_1.nExam_id, tbl_Result_1.nsbj_id
ORDER BY Pass DESC

2 个答案:

答案 0 :(得分:1)

I am not sure what your situation is, but perhaps this helps you.

your line:

WHERE ... * 100 >=

here you check for 'bigger or equal than'.

to check for 'less than' just use:

WHERE ... * 100 <

答案 1 :(得分:1)

我试图简化您的查询。

SELECT  [Teacher Name],
    [Subject],
    [Course Code],
    [Class],
    COUNT(*) AS [Pass Count]
FROM (
    SELECT  tbl_Users.strfname + ' ' + tbl_Users.strlname AS [Teacher Name],
            tbl_Subject.strSubject AS [Subject], 
            tbl_Subject.strCourseCode AS [Course Code], 
            tbl_Class.strClass AS [Class], 
            CAST(tbl_Result_1.strObtMarks AS float) / CAST(tbl_Result_1.strTotalMarks AS float) * 100 AS MarkPct,
            CAST(strPercentage AS float) AS PassPct
    FROM    tbl_Users 
            INNER JOIN tbl_Result AS tbl_Result_1 ON tbl_Users.nu_id = tbl_Result_1.nu_id   
                AND tbl_Users.nsch_id = tbl_Result_1.nsch_id
                AND tbl_Users.bisDeleted = tbl_Result_1.bisDeleted
            INNER JOIN tbl_Subject ON tbl_Result_1.nsbj_id = tbl_Subject.nsbj_id
                AND tbl_Users.nsch_id = tbl_Subject.nsch_id
                AND tbl_Users.bisDeleted = tbl_Subject.bisDeleted
            INNER JOIN tbl_Class ON tbl_Result_1.nc_id = tbl_Class.nc_id 
                AND tbl_Users.nsch_id = tbl_Class.nsch_id
                AND tbl_Users.bisDeleted = tbl_Class.bisDeleted
            INNER JOIN tbl_TeacherSubject ON tbl_Class.nc_id = tbl_TeacherSubject.nc_id 
                AND tbl_Users.nsch_id = tbl_TeacherSubject.nsch_id
                AND tbl_Users.bisDeleted = tbl_TeacherSubject.bisDeleted
            INNER JOIN tbl_Percentage ON tbl_Users.nsch_id = tbl_Percentage.nsch_id
    WHERE   tbl_Users.nsch_id = @sch
                AND tbl_Users.bisDeleted = @fbit
                AND tbl_Result_1.nExam_id = @exam
                AND tbl_Result_1.nsbj_id = @sub
                AND SUBSTRING(tbl_Result_1.dtAddDate, 7, 4) = @txtdate
        ) x
WHERE MarkPct >= PassPct
GROUP BY [Teacher Name],
        [Subject],
        [Course Code],
        [Class]