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;
相关推荐
Mr.朱鹏13 小时前
Linux 服务器 LVM 根分区在线动态扩容
linux·服务器·数据库
摇滚侠13 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 数据库初始化机制 阅读笔记 36
数据库·spring boot·笔记
qiuhaipeng113 小时前
Claude code 升级后上下文长度变短问题
java·前端·数据库
wxwx_bscxy32214 小时前
基于Python新冠疫情可视化分析系统的设计与实现
java·数据库·spring boot·python·微信小程序·sqlite
剑之所向15 小时前
.NET 官方`System.Threading.Channels`
前端·javascript·数据库
词却15 小时前
数据库基础:DQL 数据查询语言
数据库·oracle
昌原的儿子LEO17 小时前
Linux IO多路复用与SQLite数据库核心知识点总结
linux·数据库·oracle
山岚的运维笔记18 小时前
mysql 专业笔记 -- 第 8 章:使用变量
运维·数据库·笔记·后端·学习·mysql·dba
聚美智数18 小时前
网安查询-备案查询-网络安全查询API接口介绍
网络·数据库·web安全
坐吃山猪18 小时前
【多线程】Semaphore使用
java·数据库·oracle·多线程