我希望得到奖项最多的电影的输出。我遇到的问题是如何展示一部电影?我尝试创建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;
表:
答案 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