SQL:您如何在列中显示占总数的百分比?
Posted
技术标签:
【中文标题】SQL:您如何在列中显示占总数的百分比?【英文标题】:SQL: How do you showcase the percentage of total in a column? 【发布时间】:2016-07-21 21:16:21 【问题描述】:我必须创建一个电影数据库,其中一个查询涉及显示用户“评分”的电影列表以及实际评分和类型。
此外,它必须显示该类型在用户评分的所有电影中所占的百分比。例如:
CREATE TABLE GENRES (
MOVIEID INT NOT NULL,
GENRE VARCHAR(20),
PRIMARY KEY(MOVIEID),
FOREIGN KEY(MOVIEID) REFERENCES MOVIES(ID)
);
查询:
SELECT U.USERID, M.TITLE, U.USERRATING, G.GENRE
FROM USER_RATEDMOVIES U, MOVIES M, GENRES G
WHERE (M.ID = U.MOVIEID) AND (U.USERID LIKE "EXAMPLE") AND (G.MOVIEID = M.ID)
ORDER BY DATE_YEAR, DATE_MONTH, DATE_DAY, DATE_HOUR, DATE_MINUTE, DATE_SECOND;
这将返回我需要的所有内容,除了总数的百分比。那就是我迷路的地方。我是 SQL 新手,并且在 COUNT(*) 和 GROUP BY 中挣扎。
【问题讨论】:
您使用的是SQL Server
还是mysql
?你们都标记了。
对于初学者,您应该停止使用过时的 ANSI-89 样式连接并使用“较新”的 ANSI-92 样式连接。自该标准实施以来,已经过去了 20 多年。 sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/… 我不清楚你期望的输出是什么。
我目前正在使用 MySQL。而且我不知道这些类型的连接,我的代码基于我的讲师的材料。
@jpw 很伤心。这些年来,我见过很多人从学校毕业后就拥有在 sql server 中编写游标的能力,但不知道如何以基于集合的方法来编写游标。他们也很少教学生使用参数化查询,很多人离开学校时唯一的查询示例就是教科书注入模型。
太好了,游标。难怪这么多网站需要很长时间才能呈现输出。
【参考方案1】:
您的需求面临的挑战是呈现单元级数据和聚合级数据。因此,请考虑使用聚合 groupby 派生表(FROM
或 JOIN
子句中的嵌套选择语句)与您之前设置的查询相关(匹配 USERID
)(使用显式而不是隐式连接):
SELECT U.USERID, M.TITLE, U.USERRATING, G.GENRE,
(gdT.GENRE_COUNT / udT.RATING_COUNT) AS PERCENTAGE
FROM USER_RATEDMOVIES U
INNER JOIN MOVIES M ON M.ID = U.MOVIEID
INNER JOIN GENRES G ON M.ID = G.MOVIEID
INNER JOIN
-- COUNTS BY CORRESPONDING USER AND GENRE
(SELECT subU.USERID, subG.GENRE, Count(*) AS GENRE_COUNT
FROM USER_RATEDMOVIES subU
INNER JOIN MOVIES subM ON subM.ID = subU.MOVIEID
INNER JOIN GENRES subG ON subM.ID = subG.MOVIEID
GROUP BY subU.USERID, subG.GENRE) AS gdT
ON gdT.USERID = U.USERID AND gdT.GENRE = G.GENRE
INNER JOIN
-- COUNTS BY CORRESPONDING USER
(SELECT subU.USERID, Count(*) AS RATING_COUNT
FROM USER_RATEDMOVIES subU
GROUP BY subU.USERID) AS udT
ON udT.USERID = U.USERID
WHERE U.USERID LIKE "EXAMPLE"
ORDER BY DATE_YEAR, DATE_MONTH, DATE_DAY,
DATE_HOUR, DATE_MINUTE, DATE_SECOND;
【讨论】:
以上是关于SQL:您如何在列中显示占总数的百分比?的主要内容,如果未能解决你的问题,请参考以下文章