一、背景说明
移动运营商平台提供多种类型的产品权益,用户可以通过订购来使用。平台需要定期统计各个产品的用户订购情况,以便了解各个产品的受欢迎程度。这些统计数据将用于优化产品、提升用户体验和制定市场推广策略。
二、表结构说明
梧桐数据库建表语句
用户表
CREATE TABLE users( useid INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'Primary Key',username VARCHAR(255)
) comment '用户表';
注册表
create table Register(contest_id INT not null ,user_id int not null
)comment '注册表';
oracle数据库建表语句
用户表
CREATE TABLE users (useid INT PRIMARY KEY,username VARCHAR2(255)
) COMMENT ON TABLE users IS '用户表';
注册表
CREATE TABLE Register (contest_id INT NOT NULL,user_id INT NOT NULL,CONSTRAINT pk_register PRIMARY KEY (contest_id, user_id)
);
三、表数据插入
梧桐数据库、oracle数据库sql语句插入,由于两种数据库插入sql基本一致,这边以梧桐数据库展示。
用户表
INSERT INTO users ( useid, username ) values ( 8, 'wang' );
INSERT INTO users ( useid, username ) values ( 3, 'ding');
INSERT INTO users ( useid, username ) values ( 6, 'zhao' );
INSERT INTO users ( useid, username ) values ( 1, 'xu' );
注册表
INSERT INTO `Register` ( contest_id, user_id ) values ( 212, '1' );
INSERT INTO `Register` ( contest_id, user_id ) values ( 213, '1' );
INSERT INTO `Register` ( contest_id, user_id ) values ( 214, '1' );
INSERT INTO `Register` ( contest_id, user_id ) values ( 220, '1' );
INSERT INTO `Register` ( contest_id, user_id ) values ( 156, '1' );
INSERT INTO `Register` ( contest_id, user_id ) values ( 156, '3' );
INSERT INTO `Register` ( contest_id, user_id ) values ( 212, '3' );
INSERT INTO `Register` ( contest_id, user_id ) values ( 212, '6' );
INSERT INTO `Register` ( contest_id, user_id ) values ( 212, '8' );
INSERT INTO `Register` ( contest_id, user_id ) values ( 213, '3' );
INSERT INTO `Register` ( contest_id, user_id ) values ( 213, '6' );
INSERT INTO `Register` ( contest_id, user_id ) values ( 213, '8' );
INSERT INTO `Register` ( contest_id, user_id ) values ( 220, '3' );
INSERT INTO `Register` ( contest_id, user_id ) values ( 220, '8' );
INSERT INTO `Register` ( contest_id, user_id ) values ( 214, '3' );
INSERT INTO `Register` ( contest_id, user_id ) values ( 156, '8' );
四、sql实现
SELECT contest_id,ROUND(COUNT(DISTINCT user_id) / (SELECT COUNT(*) FROM users) * 100, 2) AS percentage
FROM Register
GROUP BY contest_id
ORDER BY percentage DESC, contest_id;
五、sql实现思路分析
ROUND(COUNT(DISTINCT user_id) / (SELECT COUNT() FROM users) * 100, 2) AS percentage: 计算每个产品的注册用户百分比,并保留两位小数。 COUNT(DISTINCT user_id): 计算每个产品的唯一注册用户数量。 (SELECT COUNT() FROM users): 计算总用户数量。
*100: 将结果转换为百分比。
ROUND(..., 2): 将结果保留两位小数。
GROUP BY contest_id: 按产品ID分组
ORDER BY percentage DESC, contest_id: 先按百分比降序排列,如果百分比相同,则按产品ID升序排列。