Sql 数据透视表给出错误的结果

Sql 数据透视表给出错误的结果,sql,sql-server,pivot,pivot-table,Sql,Sql Server,Pivot,Pivot Table,下面的代码给出了如第一幅图所示的结果集 SELECT dbo.tbStudent.Name, dbo.tbStudent.RegNo, dbo.tbFee.PID, dbo.tbFee.Purpose, dbo.tbFee.AmountPaid, dbo.tbFee.StudentID, dbo.tbFee.Date, dbo.tbFee.FeeID, dbo.tbFee.SemID, dbo.tbFee.CourseID, dbo.tb

下面的代码给出了如第一幅图所示的结果集

  SELECT     dbo.tbStudent.Name, dbo.tbStudent.RegNo, dbo.tbFee.PID, dbo.tbFee.Purpose, dbo.tbFee.AmountPaid, dbo.tbFee.StudentID, dbo.tbFee.Date, dbo.tbFee.FeeID, 
                      dbo.tbFee.SemID, dbo.tbFee.CourseID, dbo.tbFee.ModeOfPayment, dbo.tbFee.CheckNo, dbo.tbFee.DDNo, dbo.tbFee.HostelDDNo, dbo.tbFee.FRID, 
                      dbo.tbStudent.Parentage, dbo.tbCourse.Name AS Course, ISNULL(dbo.tbSemester.SemName, ' + @st +') AS Semester
FROM         dbo.tbFee INNER JOIN
                      dbo.tbStudent ON dbo.tbFee.StudentID = dbo.tbStudent.StudentID INNER JOIN
                      dbo.tbCourse ON dbo.tbFee.CourseID = dbo.tbCourse.CourseID LEFT OUTER JOIN
                      dbo.tbSemester ON dbo.tbFee.SemID = dbo.tbSemester.SemID  Where tbFee.SemID=1 

但是,使用透视表,我需要以下结果:

我的数据透视表代码是:

SET @values = '';
 If(@SemID=0)
    BEGIN
        SELECT @values = @values +'['+ CAST(PurPose AS varchar(max))+ ']' + ','
        FROM tbFee Where CourseID=@CourseID
        SET @values = SUBSTRING(@values, 1, Len(@values) - 1)
    END
ELSE
    BEGIN
        SELECT @values = @values +'['+ CAST(PurPose AS varchar(max))+ ']' + ','
        FROM tbFee Where SemID=@SemID
        SET @values = SUBSTRING(@values, 1, Len(@values) - 1)
    END

 Declare @st nvarchar(max)
 set @st='''Not Available''';
 declare @q nvarchar(max)
set @q = '
 Select * from(

SELECT     dbo.tbStudent.Name, dbo.tbStudent.RegNo, dbo.tbFee.PID, dbo.tbFee.Purpose, dbo.tbFee.AmountPaid, dbo.tbFee.StudentID, dbo.tbFee.Date, dbo.tbFee.FeeID, 
                      dbo.tbFee.SemID, dbo.tbFee.CourseID, dbo.tbFee.ModeOfPayment, dbo.tbFee.CheckNo, dbo.tbFee.DDNo, dbo.tbFee.HostelDDNo, dbo.tbFee.FRID, 
                      dbo.tbStudent.Parentage, dbo.tbCourse.Name AS Course, ISNULL(dbo.tbSemester.SemName, ' + @st +') AS Semester
FROM         dbo.tbFee INNER JOIN
                      dbo.tbStudent ON dbo.tbFee.StudentID = dbo.tbStudent.StudentID INNER JOIN
                      dbo.tbCourse ON dbo.tbFee.CourseID = dbo.tbCourse.CourseID LEFT OUTER JOIN
                      dbo.tbSemester ON dbo.tbFee.SemID = dbo.tbSemester.SemID  Where tbFee.SemID=1  
          ) as x
          pivot (
    max(AmountPaid)
    for Purpose in (' + @values + ')
) as pvt
'

exec (@q)
我在@Values中获得了Purpose列的值,这是因为行数可以更改。然而,对于具有相同regNo的同一学生,我得到的结果不是单行,而是以下结果:

但我得到的信息如下:


在数据透视的源查询中,您应该只指定实际数据透视中涉及的列,即
dbo.tbStudent.Name、dbo.tbStudent.RegNo、dbo.tbFee.Purpose、dbo.tbFee.AmountPaid

SELECT     
dbo.tbStudent.Name, 
dbo.tbStudent.RegNo,
dbo.tbFee.Purpose, 
dbo.tbFee.AmountPaid
FROM         
dbo.tbFee 
INNER JOIN dbo.tbStudent ON dbo.tbFee.StudentID = dbo.tbStudent.StudentID 
INNER JOIN dbo.tbCourse ON dbo.tbFee.CourseID = dbo.tbCourse.CourseID 
LEFT OUTER JOIN dbo.tbSemester ON dbo.tbFee.SemID = dbo.tbSemester.SemID  
Where tbFee.SemID=1

如果除了这些列之外还有其他列,它们将被分解到pivot计算中,您将得到相应的多行。

所有这些列也需要出现在结果中,我只是在图片中删除了它们以使其可读。源查询很好。它必须是这样的,因为我需要所有这些列。问题是这些其他列导致您的pivot结果与您预期的不同。您可以先做透视,然后将透视结果连接到其他列