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;
相关推荐
钢铁男儿10 分钟前
PyQt5高级界而控件(容器:装载更多的控件QDockWidget)
数据库·python·qt
阿蒙Amon3 小时前
C# Linq to SQL:数据库编程的解决方案
数据库·c#·linq
互联网搬砖老肖7 小时前
运维打铁: MongoDB 数据库集群搭建与管理
运维·数据库·mongodb
典学长编程8 小时前
数据库Oracle从入门到精通!第四天(并发、锁、视图)
数据库·oracle
积跬步,慕至千里8 小时前
clickhouse数据库表和doris数据库表迁移starrocks数据库时建表注意事项总结
数据库·clickhouse
极限实验室9 小时前
搭建持久化的 INFINI Console 与 Easysearch 容器环境
数据库
星辰离彬9 小时前
Java 与 MySQL 性能优化:Java应用中MySQL慢SQL诊断与优化实战
java·后端·sql·mysql·性能优化
白仑色9 小时前
Oracle PL/SQL 编程基础详解(从块结构到游标操作)
数据库·oracle·数据库开发·存储过程·plsql编程
程序猿小D11 小时前
[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的个人财务管理系统,推荐!
java·数据库·mysql·spring·毕业论文·ssm框架·个人财务管理系统
zhuiQiuMX11 小时前
脉脉maimai面试死亡日记
数据仓库·sql·面试