SQLServer:此存储过程创建动态数据透视表的错误是什么?

时间:2011-10-17 07:02:35

标签: sql-server sql-server-express

我创建了以下存储过程来获取动态数据透视表,该表可以在第一列中的任意数量的员工和第一行中的任意数量的课程中展开

DECLARE @PivotColumnHeaders VARCHAR(MAX)
    SELECT @PivotColumnHeaders =
      COALESCE(
        @PivotColumnHeaders + ',[' + cast(CourseName as varchar) + ']',
        '[' + cast(CourseName as varchar)+ ']'
      )
    FROM employee, courses

    DECLARE @PivotTableSQL NVARCHAR(MAX)
    SET @PivotTableSQL = N'
      select
      *
    from
    (
    SELECT     dbo.employee.Name, dbo.employee.BadgeNo, dbo.employee.Division, dbo.employee.Organization, dbo.courses.CourseName, dbo.courses.CourseID
    FROM         dbo.employee LEFT OUTER JOIN
                          dbo.courses ON dbo.employee.CourseID = dbo.courses.CourseID
    ) DataTable
    PIVOT
    (
      Count(CourseID)
      FOR CourseName
      IN (
        '+ @PivotColumnHeaders+'
      )
    ) PivotTable
    '

    EXECUTE(@PivotTableSQL)

这个存储过程的问题是:当我使用sql server management studio工具添加课程和员工时,它给了我以下错误:

Msg 8156,Level 16,State 1,Line 17 “数据透视表”已多次指定“xxxxx”列。

xxxxx是表中第一个员工的名称。

1 个答案:

答案 0 :(得分:0)

在构建列标题时,是否需要在第一个Select语句中指定distinct关键字?我猜测一名员工的员工可能会参加同一门课程两次或更多次(或许是复习)