我试图了解数据透视表的行为。这是我正在执行的查询
Declare @Students table (id int, name varchar(20))
insert into @Students VALUES(1, 'First Student')
insert into @Students VALUES(2, 'Second Student')
insert into @Students VALUES(3, 'Third Student')
Declare @Subjects table (id int, subject varchar(30))
insert into @Subjects VALUES (1, 'c#')
insert into @Subjects VALUES (2, 'Sql Server')
insert into @Subjects VALUES (3, 'Asp.net')
insert into @Subjects VALUES (4, 'Winforms')
Declare @StudentSubjects table (studentid int, subjectid int)
insert into @StudentSubjects VALUES(1,2)
insert into @StudentSubjects VALUES(1,3)
insert into @StudentSubjects VALUES(2,1)
insert into @StudentSubjects VALUES(2,2)
select name, [Sql Server], [Asp.net], [c#], [Winforms] from
(
select st.name, su.[subject],
Case When su.[subject] IS NULL OR st.name IS NULL THEN 'FALSE' ELSE 'TRUE' END as VALUE
FROM @Students st FULL outer join @StudentSubjects ss on st.id = ss.studentid
FULL Outer join @Subjects su on su.id = ss.subjectid
) as x
pivot
(
MIN(value)
for [subject] in ([Sql Server], [Asp.net], [c#], [Winforms])
)pv
它返回的结果集是
我不想要第一行。如何防止返回此行。还有什么是将Null值转换为false的最佳方法。我试过的方法是在select语句中使用ISNULL(),如
select name, ISNULL([Sql Server],'false') as [Sql Server] ...
答案 0 :(得分:1)
试试这个,我刚刚在你的select语句中添加了where条件。希望它可以帮到你!
select name, [Sql Server], [Asp.net], [c#], [Winforms] from
(
select st.name, su.[subject],
Case When su.[subject] IS NULL OR st.name IS NULL THEN 'FALSE' ELSE 'TRUE' END as VALUE
FROM @Students st FULL outer join @StudentSubjects ss on st.id = ss.studentid
FULL Outer join @Subjects su on su.id = ss.subjectid
where st.name is not null
) as x
pivot
(
MIN(value)
for [subject] in ([Sql Server], [Asp.net], [c#], [Winforms])
)pv
答案 1 :(得分:1)
您可以在子查询或外部查询中添加where
条件,让您感觉舒适。
select name, [Sql Server], [Asp.net], [c#], [Winforms] from
(
select st.name, su.[subject],
Case When su.[subject] IS NULL OR st.name IS NULL THEN 'FALSE' ELSE 'TRUE' END as VALUE
FROM @Students st FULL outer join @StudentSubjects ss on st.id = ss.studentid
FULL Outer join @Subjects su on su.id = ss.subjectid
) as x
pivot
(
MIN(value)
for [subject] in ([Sql Server], [Asp.net], [c#], [Winforms])
)pv
where name is not NULL
或者像AK47提到的那样