出勤表样本数据 -
+--------------+-------------+-----------+------------+------------+
| EnrollmentNo | SubjectCode | Date | Attendance | CourseCode |
+--------------+-------------+-----------+------------+------------+
| DDU-140/12 | CSHT101 | 1/9/2018 | 1 | BSCCS |
| DDU-140/12 | CSHT101 | 1/10/2018 | 1 | BSCCS |
| DDU-140/12 | CSHT101 | 1/11/2018 | 2 | BSCCS |
| DDU-286/12 | CSHT101 | 1/9/2018 | 1 | BSCCS |
| DDU-286/12 | CSHT101 | 1/10/2018 | 1 | BSCCS |
| DDU-286/12 | CSHT101 | 1/11/2018 | 0 | BSCCS |
| DDU-286/12 | CSHT102 | 1/11/2018 | 1 | BSCCS |
| DDU-286/12 | CSHT102 | 1/14/2018 | 2 | BSCCS |
| DDU-320/12 | CSHT101 | 1/9/2018 | 2 | BSCCS |
| DDU-320/12 | CSHT101 | 1/10/2018 | 1 | BSCCS |
| DDU-320/12 | CSHT101 | 1/11/2018 | 0 | BSCCS |
| DDU-320/12 | CSHT102 | 1/11/2018 | 1 | BSCCS |
| DDU-320/12 | CSHT102 | 1/14/2018 | 0 | BSCCS |
+--------------+-------------+-----------+------------+------------+
学生表样本数据 -
+--------------+--------+-------------+------------+------+
| EnrollmentNo | RollNO | CollegeCode | CourseCode | Year |
+--------------+--------+-------------+------------+------+
| DDU-140/12 | 22 | DDUC | BSCCS | 2012 |
| DDU-286/12 | 15 | DDUC | BSCCS | 2012 |
| DDU-320/12 | 38 | DDUC | BSCCS | 2012 |
+--------------+--------+-------------+------------+------+
StudentSubject表样本数据 -
+--------------+-------------+
| EnrollmentNo | SubjectCode |
+--------------+-------------+
| DDU-140/12 | CSHT101 |
| DDU-286/12 | CSHT101 |
| DDU-286/12 | CSHT102 |
| DDU-320/12 | CSHT101 |
| DDU-320/12 | CSHT102 |
+--------------+-------------+
主题表样本数据 -
+-------------+---------------------------+
| SubjectCode | SubjectName |
+-------------+---------------------------+
| CSHP101 | Software Lab based on 101 |
| CSHT101 | Programming Fundamentals |
| CSHT102 | Discrete Structures |
+-------------+---------------------------+
输出 -
错误的输出显示参数 -
@enrollno = 'DDU-320/12',
@startdate = '1/9/2018',
@enddate = '1/11/2018'
作为2,1,0和NA,应显示NA,1而不是2,1,1和2,1,1正在显示。
无法指出我正在犯的错误。有人可以看看吗?
CREATE PROCEDURE GET_ATTENDANCE_REPORT_FOR_STUDENT
@enrollno varchar(10),
@startdate DATE,
@enddate DATE
AS BEGIN
DECLARE @query as varchar(MAX);
with cte (startdate) as
(
select @startdate startdate
union all
select dateadd(DD, 1, startdate)
from cte
where startdate < @enddate
)
select @query = coalesce(@query, '') +
N',coalesce(MAX(CASE when A.[Date] = ''' +
cast(cte.startdate as nvarchar(20)) +
N''' THEN Convert(varchar(10),A.[Attendance]) end), ''NA'') ' +
quotename(convert(char(6), cte.startdate,106))
from cte
where datename(weekday, cte.startdate) <> 'Sunday';
set @query = 'Select Concat(S.SubjectCode,'' '',S.SubjectName) Subject' + @query + '
from Attendance A, Student St, StudentSubject SS, Subject S
where A.EnrollmentNo=St.EnrollmentNo and St.EnrollmentNo=SS.EnrollmentNo and SS.SubjectCode=S.SubjectCode and St.EnrollmentNo =''' + @enrollno + '''
Group By S.SubjectName,S.SubjectCode';
Execute (@query)
END
答案 0 :(得分:1)
您缺少连接条件,Attendance
表也需要与SubjectCode
连接。由于缺少条件,它将从SubjectCodes
中选择日期。
set @query = '
SELECT Concat(S.SubjectCode, '' '', S.SubjectName) Subject
'+ @query +'
FROM Attendance A
INNER JOIN Student St
ON A.EnrollmentNo = St.EnrollmentNo
INNER JOIN StudentSubject SS
ON St.EnrollmentNo = SS.EnrollmentNo
AND a.SubjectCode = ss.SubjectCode --here
INNER JOIN Subject S
ON SS.SubjectCode = S.SubjectCode
WHERE St.EnrollmentNo =''' + @enrollno + '''
GROUP BY S.SubjectName,
S.SubjectCode'
Execute (@query)
还开始在旧式逗号分隔的连接上使用INNER JOIN
语法。将连接条件保留在ON
子句中,并在Where
子句中进行过滤。
说完了所有内容后,根据您的预期结果,您根本不需要这两张桌子