代码之家  ›  专栏  ›  技术社区  ›  Ryan Gadsdon

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

  •  0
  • Ryan Gadsdon  · 技术社区  · 7 年前

    在SQL Server中,有什么方法可以在分组后选择要显示的特定字符串?

    SELECT MIN(MovieName) AS [Movie Name], Genre
    FROM Movie
    GROUP BY Genre
    

    结果是:

    Movie Name     Genre
       Anon        Sci-fi
    

    现在我知道你可以使用最小值/最大值来显示那个专栏,但是我可以显示“星际迷航”吗。

     Movie Name    Genre
     Star Trek     Sci-fi
    

    sql fiddle- http://sqlfiddle.com/#!6/0e12fa/6

    1 回复  |  直到 7 年前
        1
  •  3
  •   GuidoG    7 年前

    基于流行度的解决方案:

    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
    

    结果与上述完全相同。
    但如果有什么变化(新的类型或你想显示 萤火虫 代替 星际迷航 )然后你必须改变你的客户。