所以我做了一个像这样的选择查询:
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)。至于如果只有一行电影名称,我需要看到它,即使它有空值。但如果该影片中有多行,则应删除该行的空行并显示所有非空的行
答案 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