Pivot Sql Query返回不需要的行

时间:2014-05-07 05:27:53

标签: sql sql-server

我试图了解数据透视表的行为。这是我正在执行的查询

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

它返回的结果集是

enter image description here

我不想要第一行。如何防止返回此行。还有什么是将Null值转换为false的最佳方法。我试过的方法是在select语句中使用ISNULL(),如

select name, ISNULL([Sql Server],'false') as [Sql Server] ...

2 个答案:

答案 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提到的那样