在SQL Server中是否有任何方法可以选择在分组后显示的特定字符串?
e.g。
SELECT MIN(MovieName) AS [Movie Name], Genre
FROM Movie
GROUP BY Genre
结果:
Movie Name Genre
Anon Sci-fi
现在我知道你可以使用min / max作为该列,但无论如何我可以显示“星际迷航”。例如。
Movie Name Genre
Star Trek Sci-fi
sql fiddle - http://sqlfiddle.com/#!6/0e12fa/6
答案 0 :(得分:3)
基于受欢迎程度的解决方案:
declare @Movie TABLE (
MovieName varchar(25),
Genre varchar(20),
popularity int
)
INSERT INTO @Movie (MovieName, Genre, popularity)
VALUES ('Star Wars', 'Sci-fi', 0),
('Anon', 'Sci-fi', 0),
('Star Trek', 'Sci-fi', 1),
('Moon', 'Sci-fi', 0),
('Csi', 'Crime', 0)
select m.Genre,
(select top 1 m2.MovieName from @Movie m2 where m2.Genre = m.Genre order by m2.popularity desc) as MovieName
from @Movie m
group by m.Genre
结果是
Genre MovieName
_________________
Crime Csi
Sci-fi Star Trek
此解决方案无需维护,它将继续正常工作。
快速而肮脏的解决方案:
首先创建一个视图
create view vwMovie as
select Genre,
case when Genre = 'Sci-fi' then 'Star Trek'
when Genre = 'Crime' then 'Csi'
else 'unknown'
end as MovieName
from Movie
group by Genre
现在在您的客户端中使用此查询
select * from vwMovie
结果与上述完全相同。
但是,如果有任何变化(新类型或您希望显示firefly
而不是star trek
),那么您不必更改您的客户端,只需更改数据库中的视图。
所以维护仍然有可能。
快速且非常脏的解决方案:
select Genre,
case when Genre = 'Sci-fi' then 'Star Trek'
when Genre = 'Crime' then 'Csi'
else 'unknown'
end as MovieName
from @Movie
group by Genre
结果与上述完全相同。
但是,如果有任何变化(新类型或您希望显示firefly
而不是star trek
),那么您必须更改您的客户。
因此,维护非常困难,因为您必须在任何地方更新您的客户端。