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;
相关推荐
怪奇云呼军1 分钟前
闪电智能VoiceAgent 如何管理呼入、接听、桥接和挂断状态?
java·前端·网络·数据库·人工智能
秋田君31 分钟前
QT_实战TCP 聊天程序说明文档以及实现
数据库·qt·tcp/ip
01_ice1 小时前
MySQL基本查询1
数据库·mysql
腾科IT教育1 小时前
Oracle OCP/OCM认证含金量实测2026版
数据库·oracle·ocp·ocm·甲骨文
不可求~10 小时前
多模型路由怎么落地:把任务分流写进项目的最小实现
java·前端·数据库
Lumistory10 小时前
城市建筑照明的落地与长效运营观察
大数据·数据库·中间件·光照贴图
围炉聊科技13 小时前
长期免费的数据库方案——零成本基建系列
数据库
AC赳赳老秦13 小时前
公开图片 OCR 数据提取:OpenClaw 合规采集公开信息图,识别文字与表格并转化为结构化数据
java·大数据·前端·数据库·python·php·openclaw
bransyin14 小时前
一个 SQL 字段到底是怎么算出来的?我做了一个能给出“证据”的血缘工具
大数据·sql·ai·血缘
梁辰兴15 小时前
软件工程:数据结构设计
数据库·软件工程·设计原则·设计方法·梁辰兴·数据库结构设计·数据库结构类型