SQL每日一练(3)

前言:

难得看到了套好题,没考我,呜呜,今日第三更!

原始表(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;
相关推荐
计算机毕设VX:Fegn089530 分钟前
计算机毕业设计|基于springboot + vue服装商城系统(源码+数据库+文档)
数据库·vue.js·spring boot·课程设计
WX-bisheyuange1 小时前
基于Spring Boot的智慧校园管理系统设计与实现
java·大数据·数据库·毕业设计
JavaGuide2 小时前
对标MinIO!全新一代分布式文件系统诞生!
数据库·后端
快乐非自愿2 小时前
数据库如何处理大量的交易流水记录
数据库·oracle
IvorySQL2 小时前
瀚高硬核助力 PG 社区:Postgres 19 迎来并行 TID 范围扫描,速度提升 3 倍
数据库·postgresql·开源
ServBay2 小时前
MongoDB 的文档模型与 CRUD 实战
数据库·后端·mongodb
ITMr.罗2 小时前
深入理解EF Core更新机制(开发中因为省事遇到的问题)
服务器·数据库·c#·.net
梁萌2 小时前
MySQL索引的使用技巧
数据库·mysql·索引·b+tree
x10n93 小时前
OceanBase 参数对比工具 附源码
数据库·vscode·oceanbase·腾讯云ai代码助手
RestCloud3 小时前
如何用ETL做实时风控?从交易日志到告警系统的实现
数据库·数据仓库·kafka·数据安全·etl·数据处理·数据集成