【问题标题】:Error in Dynamic PIVOT Table in SQLSQL 中的动态数据透视表中的错误
【发布时间】:2014-03-06 13:37:54
【问题描述】:

我在动态数据透视表中遇到错误。

我有一个像 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], '+@colList+' 
   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 = '''+@acadyear+''')
        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'.

请给出解决方案

【问题讨论】:

    标签: sql sql-server pivot unpivot


    【解决方案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

    【讨论】:

    • 我知道。但是我怎样才能得到方括号呢?我试过这个.. QUOTENAME(CONVERT(VARCHAR(19), TTM.Attend_Date, 103) + ' '+ TTM.Time_From)
    • @QuaBiz 我不确定我是否理解您的问题,我提供的示例演示了如何将两列放入一组方括号中。
    • 你能告诉我如何在这个 PIVOT 中添加两列 (MAX(Attendance) FOR Attend_Date,Time_from IN (' + @colList + ') ) pvt '
    • @QuaBiz 您是否尝试透视 2 列的值?如果是这样,我建议您编辑您的问题并提供最终所需的结果。
    • 是的,我正在尝试 PIVOT 2 列的值。我已经提到了这一点----我正在使用这个 PIVOT 查询,但得到了这个错误。我必须使用 Attend_Date 和 Time 作为列名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2017-02-24
    • 2022-01-18
    相关资源
    最近更新 更多