sql消除不需要的行

时间:2017-06-22 20:02:21

标签: sql sql-server ssms where having

所以我做了一个像这样的选择查询:

select distinct
    f.[film name]
    ,f.city
    ,case rt.[type name]
    when 'director' then p.[participant name] else null end 'partecipant name'
    ,case rt.[type name]
    when 'director' then 'director' else null end 'role type'
from Films f
    inner join FilmParticipants fp on fp.filmID=f.filmID
    inner join Participants p on p.participantID=fp.participantID
    inner join RoleType rt on rt.roleID=fp.roleID
where f.city in(
    select f.city
    from Films f
    group by f.city
    having COUNT(*)>1
)
order by f.city

它产生了这个表:

film name | city   | participant name | role type
__________________________________________________
Dragon    | London | null             | null
Dragon    | London | Morty            | director
Dragon    | London | James            | director
Shrek     | London | null             | null

现在我想要消除第一行,因为我不需要它,它有空值,我在第二行有电影名称。但是我不能''[参与者名称] = null ...等等......因为它也会删除我的第三行,因为他的名字只显示一次所以我需要它。我该怎么办? 我不能使用'max'函数,因为它也会消除第三行。

逻辑解释:这些案例确保每当它不是'director'角色时它就是null角色,参与者名称列也是如此(如果role列不是'director'则为null)。至于如果只有一行电影名称,我需要看到它,即使它有空值。但如果该影片中有多行,则应删除该行的空行并显示所有非空的行

2 个答案:

答案 0 :(得分:1)

您需要openDB来完成您正在进行的条件聚合。试试这个:

MAX()

答案 1 :(得分:1)

您可以在此处使用某些聚合。我格式化了这一点,所以它不仅仅是一面文字。

select MAX(f.[film name])
    , city
    , MAX(case rt.[type name] when 'director' then p.[participant name] else null END) as 'partecipant name'
    , MAX(case rt.[type name] when 'director' then 'director' else NULL END) as 'role type'
from Films f 
join FilmParticipants fp on fp.filmID = f.filmID 
join Participants p on p.participantID = fp.participantID 
join RoleType rt on rt.roleID = fp.roleID
where f.city IN
(
    SELECT f.city
    FROM Films f
    GROUP by f.city
    HAVING COUNT(*) > 1
)
GROUP BY f.city
ORDER by f.city

鉴于新的要求和缺乏可供使用的表格,我从您当前的查询中获取了表格并将它们组合在一起。

DECLARE @Films TABLE
(
    FilmName VARCHAR(20)
    , City VARCHAR(20)
    , ParticipantName VARCHAR(20)
    , RoleType VARCHAR(20)
)

INSERT @Films
(
    FilmName,
    City,
    ParticipantName,
    RoleType
)
VALUES
('Dragon', 'London', NULL, NULL),
('Dragon', 'London', 'Morty', 'director'),
('Dragon', 'London', 'James', 'director'),
('Shrek', 'London', null, null)
;

WITH SortedResults AS
(
    SELECT *
        , ROW_NUMBER()OVER(PARTITION BY FilmName ORDER BY ParticipantName) AS RowNum
    FROM @Films
)

SELECT sr.FilmName
    , sr.City   
    , sr.ParticipantName
    , sr.RoleType
FROM SortedResults sr
WHERE sr.RowNum > 1
OR FilmName IN
(
    SELECT f.FilmName
    FROM @Films f
    group by FilmName
    having MAX(ParticipantName) is null