我正在做一些工作来从数据库中提取一些信息,其中包括使用数据透视表以我们需要的格式获取信息。
问题是,这个数据包包含一堆NULL值,因此使一些信息从第一个旋转列开始相当多的列。
代码在这里:
BEGIN
CREATE TABLE dbo.tempTable
(
id varchar(100),
FirstName varchar(100),
LastName varchar(100),
code varchar(100),
rn int
)
END
BEGIN
with base as (
select distinct tblstudent.code as ID, tblstudent.firstname as FirstName, tblstudent.FamilyName as LastName, tblSubject.code as code
from tblSubject inner join tblSubjectChoice on tblSubject.id = tblSubjectChoice.subjectid inner join tblStudent on tblSubjectChoice.studentid = tblstudent.id
)
insert into temptable
SELECT *, row_number() over (partition by base.LastName order by base.ID) as rn
FROM base
END
BEGIN
SELECT * FROM tempTable
pivot (min (code) for rn in ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20])) as pvt
DROP TABLE tempTable
END
(我非常清楚它可能不是最有效的方式,但我不是在问这个问题。我们的数据集并不大)
大多数都很好,例如:
11111 John Smith 8A 8B 8C 8D 8E 8F 8G 8H 8I 8J 8K 8L NULL NULL NULL NULL NULL NULL NULL NULL
那是完美的。
然而,其他人出现如下:
11112 Bob Smith NULL NULL NULL NULL NULL 8F 8G 8H 8I 8J 8K 8L NULL NULL NULL NULL NULL NULL NULL NULL
正如您所看到的,它没有跳过NULL并且正在插入所有内容。那不是我们想要的。
我已经尝试过放入"其中IS NOT NULL"是地方,但它还在插入东西:(
编辑(更多信息): 我已经取出了一些数据,因为我在这里处理敏感数据。
tblSubject:ID(PK)代码名称
2ADD5FE0-EDC2-49FA-94C6-00BCDCD059D4 8A法文
tblSubjectChoice是一个具有tblsubject和tblstudent PK的表。我无法提供具体示例,但我只使用SQL语句中表达的列。
基本上我的数据试图从所有学生中提取所有课程。它做得很好,只是枢轴插入NULL值。
有人有任何想法吗?
答案 0 :(得分:0)
我是一个很大的白痴:)
该错误是“base by base.lastname”。它只是继续为具有相同姓氏的学生(但没有正确地命令他们?所以我看不到模式)。通过base.id进行分区非常有效。
感谢您的帮助,bluefeet:)