前言:
难得看到了套好题,没考我,呜呜,今日第三更!
原始表(ai生成)
1. 销售表(sales)
用途:记录每笔销售的产品 ID 及金额。
product_id(产品 ID) | sales_amount(销售金额) |
---|---|
1 | 120 |
1 | 180 |
2 | 200 |
3 | 150 |
3 | 100 |
4 | 100 |
5 | 50 |
2. 产品表(products)
用途:记录产品 ID 与产品名称的映射关系。
product_id(产品 ID) | product_name(产品名称) |
---|---|
1 | 产品 A |
2 | 产品 B |
3 | 产品 C |
4 | 产品 D |
5 | 产品 E |
1、查询所有时间内,销售金额占比大于等于 10% 的产品,并按占比大小降序排序,
结果输出:产品名称 销售金额 占比
2、 所有时间内,销售金额占比大于等于 10% 的产品有多少个?占比排第三大的百分比为(四舍五入 2 位小数)?
填写示例:2 11.24%
题目1:思路:窗口函数:利用sum()over()
SELECT
p.product_name AS "产品名称",
SUM(s.sales_amount) AS "销售金额",
ROUND(SUM(s.sales_amount) * 100.0 / SUM(SUM(s.sales_amount)) OVER(), 2) AS "占比"
FROM
sales s
JOIN
products p ON s.product_id = p.product_id
GROUP BY
p.product_name
HAVING
"占比" >= 10 -- 直接引用SELECT中的别名,简化计算
ORDER BY
"占比" DESC;
第二种做法:更直观:利用分布查询:
1、计算每个商品的销售金额:
WITH t1 AS (
SELECT
p.product_name,
SUM(s.sales_amount) AS sales_amount
FROM
sales s
JOIN
products p ON s.product_id = p.product_id
GROUP BY
p.product_name
)
2、计算前10%
SELECT
product_name AS "产品名称",
sales_amount AS "销售金额",
ROUND(sales_amount * 100.0 / (SELECT SUM(sales_amount) FROM t1), 2) AS "占比"
FROM
t1
WHERE
ROUND(sales_amount * 100.0 / (SELECT SUM(sales_amount) FROM t1), 2) >= 10
ORDER BY
"占比" DESC;
第二问:在第一问基础上利用count查询个数,where中加查询条件,要注意排名第三大表达方式limit1 offset2或者dense_rank的窗口去查询
1、还是一样的创建t1表,第一次将商品总值计算
WITH t1 AS (
SELECT
p.product_name,
SUM(s.sales_amount) AS sales_amount
FROM
sales s
JOIN products p ON s.product_id = p.product_id
GROUP BY p.product_name
),
2、创建t2表,计算其中10%的商品,利用dense_rank进行排序,where筛选条件
t2 AS (
SELECT
product_name,
sales_amount,
ROUND(sales_amount * 100.0 / (SELECT SUM(sales_amount) FROM t1), 2) AS ratio,
DENSE_RANK() OVER(ORDER BY ratio DESC) AS dense_rank -- 密集排名处理并列
FROM t1
WHERE ROUND(sales_amount * 100.0 / (SELECT SUM(sales_amount) FROM t1), 2) >= 10
)
3 select 即可 count(*)从第二问中查询大于10%的个数,max()找dense_rank=3的产品
SELECT
COUNT(*) AS product_count,
MAX(CASE WHEN dense_rank = 3 THEN ratio END) AS third_ratio
FROM t2;