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结果与您预期的不同。您可以先做透视,然后将透视结果连接到其他列