2014-03-06 6 views
0

Я получаю ошибку в динамической таблице PIVOT.Ошибка в динамической таблице PIVOT в SQL

У меня есть таблицы, как TT_Child

TTChild_ID  TT_ID  Roll_No  Std_Reg_ID  Attendance 
1    3    1   22      1 
2    3    2   23      0 

и таблице

TT_Master

TT_ID Attend_date Time_from Time_To Course_ID Faculty_ID Acad_Year Subject_ID 
    1 2014-03-01 10:00 11:00  1   16  2013-2014  34 
    2 2014-03-02 10:00 11:00  1   16  2013-2014  34 
    3 2014-03-03 10:00 11:00  1   16  2013-2014 34 

Student_Registration_Master

Std_Reg_ID Stud_FNAME stud_MNAME Stud_MNAME 

--Я я использую этот запрос PIVOT, но получаю эту ошибку. Я должен использовать Attend_Date и Time в качестве имени столбца.

Create PROCEDURE [dbo].[Attendance_Test] 
    @courseid as int=null, @acadyear nvarchar(15)=null 
AS 

Declare @colList varchar(max) 
Declare @qry varchar(max) 

SET @colList = STUFF((SELECT distinct ',' + QUOTENAME(CONVERT(VARCHAR(19), TTM.Attend_Date, 103)) + ' '+ QUOTENAME(TTM.Time_From) 
      FROM TT_Child SA 
      inner join TT_Master TTM on SA.TT_ID = TTM.TT_ID 
      where (TTM.Course_ID = @courseid) 
      FOR XML PATH(''), TYPE).value('/', 'NVARCHAR(MAX)') ,1,1,'') 

SET @qry = 'SELECT SA.Reg_ID, STUD_FNAME + STUD_MNAME + STUD_LNAME as [Student Name], '[email protected]+' 
    FROM 
    (
     select SA.Reg_ID, SR.STUD_FNAME, SR.STUD_MNAME, SR.STUD_LNAME, TTM.Attend_Date , SA.Attendance from TT_Child SA 
     inner join TT_Master TTM on SA.TT_ID = TTM.TT_ID 
     inner join STUDENT_Registration_MASTER SR on CR.Reg_ID = SR.STUD_Reg_ID 
     where (TTM.Course_ID = '+cast(@courseid as varchar(50))+ ') and (TTM.Acad_Year = '''[email protected]+''') 
     group by SA.Reg_ID, SR.STUD_FNAME, SR.STUD_MNAME, SR.STUD_LNAME, TTM.Attend_Date, SA.Attendance 
    ) as s 
    PIVOT 
    (
     MAX(Attendance) FOR Attend_Date IN (' + @colList + ') 
    ) pvt' 
print(@qry) 
Exec(@qry) 

- Я получаю сообщение об ошибке

SELECT SA.Reg_ID, STUD_FNAME + STUD_MNAME + STUD_LNAME as [Student Name], [01/03/2014] [10:00:00.0000000],[02/03/2014] [10:00:00.0000000],[03/03/2014] [10:00:00.0000000],[05/03/2014] [10:00:00.0000000],[05/03/2014] [11:00:00.0000000] 
    FROM 
    (
     select SA.Reg_ID, SR.STUD_FNAME, SR.STUD_MNAME, SR.STUD_LNAME, TTM.Attend_Date , SA.Attendance from TT_Child SA 
     inner join TT_Master TTM on SA.TT_ID = TTM.TT_ID 
     inner join STUDENT_Registration_MASTER SR on CR.Reg_ID = SR.STUD_Reg_ID 
     where (TTM.Course_ID = 1) and (TTM.Acad_Year = '2013-2014') 
     group by SA.Reg_ID, SR.STUD_FNAME, SR.STUD_MNAME, SR.STUD_LNAME, TTM.Attend_Date, SA.Attendance 
    ) as s 
    PIVOT 
    (
     MAX(Attendance) FOR Attend_Date IN ([01/03/2014] [10:00:00.0000000],[02/03/2014] [10:00:00.0000000],[03/03/2014] [10:00:00.0000000],[05/03/2014] [10:00:00.0000000],[05/03/2014] [11:00:00.0000000]) 
    ) pvt 

Сообщение об ошибке

Msg 102, Level 15, State 1, Line 12 
Incorrect syntax near '10:00:00.0000000'. 

Plz дают Раствора

ответ

1

При просмотре этой строки кода вы увидите ошибка:

MAX(Attendance) 
FOR Attend_Date IN ([01/03/2014] [10:00:00.0000000],[02/03/2014] [10:00:00.0000000], 
        [03/03/2014] [10:00:00.0000000],[05/03/2014] [10:00:00.0000000], 
        [05/03/2014] [11:00:00.0000000]) 

Дата и время, по желанию, каждый раз заключены в квадратные скобки, поэтому вы получите сообщение об ошибке.

Сначала необходимо объединить дату и время вместе, а затем заключить в квадратные скобки с помощью QUOTENAME. Вы должны быть в состоянии изменить код:

SET @colList 
    = STUFF((SELECT distinct ',' + QUOTENAME(CONVERT(VARCHAR(19), TTM.Attend_Date, 103) + ' '+ TTM.Time_From) 
      FROM TT_Child SA 
      inner join TT_Master TTM on SA.TT_ID = TTM.TT_ID 
      where (TTM.Course_ID = @courseid) 
      FOR XML PATH(''), TYPE).value('/', 'NVARCHAR(MAX)') ,1,1,'') 

См SQL Fiddle with Demo вашей версии и новой версии.

+0

Я знаю это. Но как я могу попасть в квадратные скобки? Я пробовал это. QUOTENAME (CONVERT (VARCHAR (19), TTM.Attend_Date, 103) + '' + TTM.Time_From) – QuaBiz

+0

@QuaBiz Я не уверен, что я понимаю ваш вопрос, пример, который я предоставил, демонстрирует, как получить два столбца в один набор квадратных скобок. – Taryn

+0

Можно ли сказать мне, как добавить две колонки в этом PIVOT ( MAX (Attendance) ДЛЯ Attend_Date, Time_from IN ('+ @colList +') ) pvt ' – QuaBiz

Смежные вопросы