如何找到单个最高值?如果有领带怎么展示一切?

时间:2016-11-30 21:52:16

标签: sql oracle

我希望得到奖项最多的电影的输出。我遇到的问题是如何展示一部电影?我尝试创建PIVOT函数,并使用MAX()函数而不是COUNT()函数;但是我只会得到几乎所有行的输出1。但是,我想使用MAX()函数来执行此操作。我也想知道我怎样才能展示所有"电影"如果有领带?根据我的信息,不会有任何关系,但如果有一个,我希望如果所有信息都显示出来。

预期产出:

MOVIE                               Awards Won
----------------------------------- ----------
Saving Private Ryan                          6

 1 rows selected 

使用我的查询输出:

MOVIE                               Awards Won
----------------------------------- ----------
A Lonely Place to Die                        5
Act of Valor                                 0
Captain America: The First Avenger           2
Date Night                                   1
Drive Angry                                  0
Saving Private Ryan                          6
Taken                                        1

 7 rows selected 

这是我的问题:

SELECT * FROM
( 
   SELECT MovieTitle AS "MOVIE",
          TBLAWARDRESULT.AWARDRESULTDESC AS "Result Type",
          TBLAWARDRESULT.AWARDRESULTID AS "Rating"

   FROM TBLMOVIE
   INNER JOIN TBLAWARDDETAIL 
           ON TBLMOVIE.MOVIEID = TBLAWARDDETAIL.MOVIEID 

   INNER JOIN TBLAWARDRESULT 
           ON TBLAWARDDETAIL.AWARDRESULTID = TBLAWARDRESULT.AWARDRESULTID

   ORDER BY Movietitle
)

PIVOT
(
  COUNT("Rating") FOR "Result Type"
  IN ('Won' AS "Awards Won")
)
ORDER BY Movie;

表:

File1 (PasteBin)

File2 (PasteBin)

3 个答案:

答案 0 :(得分:2)

使用RANK函数按奖励计数递减顺序对结果进行排序,如果有关系,也可以获得多行。

SELECT MOVIE,Awards_Won
FROM (
SELECT 
MovieTitle AS "MOVIE",
COUNT(TBLAWARDRESULT.AWARDRESULTID) AS Awards_Won,
RANK() OVER(ORDER BY COUNT(TBLAWARDRESULT.AWARDRESULTID) DESC) RNK
FROM TBLMOVIE
INNER JOIN TBLAWARDDETAIL ON TBLMOVIE.MOVIEID = TBLAWARDDETAIL.MOVIEID 
INNER JOIN TBLAWARDRESULT ON TBLAWARDDETAIL.AWARDRESULTID = TBLAWARDRESULT.AWARDRESULTID
WHERE TBLAWARDRESULT.AWARDRESULTDESC = 'Won'
) t
WHERE RNK = 1

答案 1 :(得分:2)

不要使用枢轴。使用窗口函数:

SELECT "MOVIE", AWARDS_WON
FROM (SELECT m.MovieTitle AS "MOVIE", COUNT(*) as AWARDS_WON,
             RANK() OVER (PARTITION BY m.MovieTitle ORDER BY COUNT(*) DESC) as seqnum
      FROM TBLMOVIE m INNER JOIN
           TBLAWARDDETAIL ad
           ON m.MOVIEID = ad.MOVIEID INNER JOIN
           TBLAWARDRESULT ar
           ON ad.AWARDRESULTID = ar.AWARDRESULTID
      WHERE ar.AWARDTYPE = 'Won'
      GROUP BY m.MovieTitle
     ) m
WHERE seqnum = 1;

答案 2 :(得分:1)

如果你在Oracle 12c上使用ROW_NUMBER FETCH的选项稍微简单一些。

SELECT m.MovieTitle MOVIE, COUNT(1) AS "Awards Won"
FROM
  TBLMOVIE m
    INNER JOIN 
  TBLAWARDDETAIL ad ON m.MovieID = ad.MovieID 
    INNER JOIN 
  TBLAWARDRESULT ar ON ad.AwardResultID = ar.AwardResultID
WHERE ar.AwardResultDesc = 'Won'
GROUP BY m.MovieTitle
ORDER BY "Awards Won" DESC
FETCH FIRST ROW ONLY