透视查询

时间:2018-01-14 16:50:28

标签: sql sql-server sql-server-2014

出勤表样本数据 -

+--------------+-------------+-----------+------------+------------+
| 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       |
+-------------+---------------------------+

输出 -

Output

错误的输出显示参数 -

@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

1 个答案:

答案 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子句中进行过滤。

说完了所有内容后,根据您的预期结果,您根本不需要这两张桌子

相关问题