在聚合SQL Server后显示列的特定单词

时间:2017-11-10 09:19:46

标签: sql sql-server group-by aggregation

在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

1 个答案:

答案 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),那么您必须更改您的客户。
因此,维护非常困难,因为您必须在任何地方更新您的客户端。