Oracle查询实例之订单金额占比与排名分析

 更新时间:2025年11月06日 09:57:43   作者:A耿耿  
这篇文章主要介绍了Oracle查询实例之订单金额占比与排名分析的相关资料,文中通过代码介绍了两种方法来查询每个客户在每个日期的订单金额、占比以及排名,需要的朋友可以参考下

题目

假设有一张表格 orders,记录了不同日期的订单记录,包括订单号(order_id)、订单日期(order_date)、客户 ID(customer_id)、商品 ID(product_id)、商品数量(quantity)、商品价格(price)。请编写SQL 查询语句,查询出每个客户在每个日期的订单金额和该客户在当天的订单金额占比(百分比)以及该客户在当天的订单金额占比排名。

建表语句

-- 建表
-- 创建订单表 ORDERS
CREATE TABLE ORDERS (
    order_id NUMBER PRIMARY KEY,          -- 订单编号,主键
    customer_id NUMBER NOT NULL,          -- 客户编号
    order_date DATE NOT NULL,             -- 订单日期
    product_id NUMBER NOT NULL,           -- 商品编号
    quantity NUMBER(5) NOT NULL,          -- 商品数量
    price NUMBER(10,2) NOT NULL           -- 商品单价
);

-- 插入数据
INSERT INTO ORDERS (order_id, customer_id, order_date, product_id, quantity, price) VALUES (1, 101, TO_DATE('2024-04-01', 'YYYY-MM-DD'), 1, 2, 50.00);
INSERT INTO ORDERS (order_id, customer_id, order_date, product_id, quantity, price) VALUES (2, 101, TO_DATE('2024-04-01', 'YYYY-MM-DD'), 2, 1, 100.00);
INSERT INTO ORDERS (order_id, customer_id, order_date, product_id, quantity, price) VALUES (3, 102, TO_DATE('2024-04-01', 'YYYY-MM-DD'), 3, 3, 30.00);
INSERT INTO ORDERS (order_id, customer_id, order_date, product_id, quantity, price) VALUES (4, 103, TO_DATE('2024-04-01', 'YYYY-MM-DD'), 1, 1, 50.00);
INSERT INTO ORDERS (order_id, customer_id, order_date, product_id, quantity, price) VALUES (5, 101, TO_DATE('2024-04-02', 'YYYY-MM-DD'), 2, 2, 100.00);
INSERT INTO ORDERS (order_id, customer_id, order_date, product_id, quantity, price) VALUES (6, 102, TO_DATE('2024-04-02', 'YYYY-MM-DD'), 3, 1, 30.00);
INSERT INTO ORDERS (order_id, customer_id, order_date, product_id, quantity, price) VALUES (7, 103, TO_DATE('2024-04-02', 'YYYY-MM-DD'), 1, 2, 50.00);
INSERT INTO ORDERS (order_id, customer_id, order_date, product_id, quantity, price) VALUES (8, 104, TO_DATE('2024-04-02', 'YYYY-MM-DD'), 2, 1, 100.00);
INSERT INTO ORDERS (order_id, customer_id, order_date, product_id, quantity, price) VALUES (9, 101, TO_DATE('2024-04-03', 'YYYY-MM-DD'), 1, 3, 50.00);
INSERT INTO ORDERS (order_id, customer_id, order_date, product_id, quantity, price) VALUES (10, 102, TO_DATE('2024-04-03', 'YYYY-MM-DD'), 2, 2, 100.00);
INSERT INTO ORDERS (order_id, customer_id, order_date, product_id, quantity, price) VALUES (11, 103, TO_DATE('2024-04-03', 'YYYY-MM-DD'), 3, 1, 30.00);
INSERT INTO ORDERS (order_id, customer_id, order_date, product_id, quantity, price) VALUES (12, 104, TO_DATE('2024-04-03', 'YYYY-MM-DD'), 1, 1, 50.00);

思路一:

1. 计算每个客户每天的订单金额

  • 按 order_date 和 customer_id 分组

  • 对每个分组计算:SUM(quantity * price)

2. 计算每天的总订单金额

  • 按 order_date 分组

  • 对每个分组计算:SUM(quantity * price)

3. 计算每个客户每天的订单金额占比

  • 使用上一步的结果:

    占比 = 客户当天订单金额 / 当天总订单金额

4. 计算每个客户在当天的订单金额占比排名

  • 按 order_date 分组

  • 在每个分组内,按 订单金额占比 降序排名(使用 ROW_NUMBER() 或 RANK()

图片分析

最终代码

with t1 as (
    select
        distinct
        order_date,
        customer_id,
        sum(price * quantity)over(partition by order_date, customer_id ) 用户订单金额
    from orders
),
t2 as (
    select
        order_date,
        customer_id,
        用户订单金额,
        sum(用户订单金额) over (partition by order_date) 当天订单总金额
    from t1
),
t3 as(
    select
        order_date,
        customer_id,
        用户订单金额,
        round(用户订单金额/当天订单总金额,2) 当天订单金额占比
    from t2
)
select
    order_date,
    customer_id,
    用户订单金额,
    当天订单金额占比*100||'%' 占比,
    row_number() over (partition by order_date order by 当天订单金额占比) 排序
from t3

思路二:

1.基础数据分组聚合

目的:计算每个客户在每个日期的总订单金额

  • 按 order_date 和 customer_id 分组

  • 对每个分组计算:SUM(price * quantity)

2.计算当日订单金额占比

关键技巧:窗口函数中的聚合函数嵌套

  • SUM(SUM(quantity * price)) over(partition by order_date) 的含义:

    • 内层 SUM(quantity * price):每个客户当天的订单金额

    • 外层 SUM(...) over(...):对所有这些客户金额按日期求和,得到当天总金额

    • 相当于:客户当天金额 / 当天所有客户总金额

3.计算当日排名

排名逻辑

  • partition by order_date:在每个日期内独立排名

  • order by sum(price * quantity) desc:按订单金额降序排列

  • 使用 RANK():允许并列排名(如两个客户金额相同则排名相同)

最终代码

SELECT
    order_date as 交易日期
    ,customer_id as 客户ID
    ,sum(price * quantity) as 订单金额
    ,round(sum(price * quantity) / SUM(SUM(quantity * price)) over(partition by order_date),2) as 当日订单金额占比
    ,rank() over (partition by order_date order by sum(price * quantity)desc) as 当日订单金额排名
FROM orders
group by order_date,customer_id
order by order_date,customer_id

总结 

到此这篇关于Oracle查询实例之订单金额占比与排名分析的文章就介绍到这了,更多相关Oracle订单金额占比与排名内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • oracle多条记录取第一条的实现

    oracle多条记录取第一条的实现

    这篇文章主要介绍了oracle多条记录取第一条的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Oracle为数据大表创建索引的实现步骤

    Oracle为数据大表创建索引的实现步骤

    在日常业务中,避免不了为数据量大表补充创建索引的情况,如果快速、有效地创建索引成了一个至关重要的问题,但对于超大量的,建议在原表上直接操作,所以本文给大家介绍了Oracle为数据大表创建索引的实现步骤,需要的朋友可以参考下
    2025-09-09
  • ORACLE查看当前连接数的常见方法及解释

    ORACLE查看当前连接数的常见方法及解释

    做数据库开发的时候,有时候会遇到连接超出最大限制的问题,这时候,我们需要查看数据库的连接数,这篇文章主要介绍了ORACLE查看当前连接数的常见方法及解释,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-09-09
  • Oracle数据库中如何给表赋予权限

    Oracle数据库中如何给表赋予权限

    赋权是指将特定的权限授予用户或用户组,以便他们可以执行特定的操作,如查询、插入、更新和删除数据,创建和修改表结构,以及执行其他管理任务,这篇文章主要给大家介绍了关于Oracle数据库中如何给表赋予权限的相关资料,需要的朋友可以参考下
    2024-01-01
  • Oracle 处理json数据的方法

    Oracle 处理json数据的方法

    Json数据一般使用varchar2(400),varchar2(32676)或者BLOB来存储Json数据,这篇文章主要介绍了Oracle 处理json数据的相关知识,需要的朋友可以参考下
    2022-11-11
  • 装Oracle用PLSQL连接登录时不显示数据库的解决

    装Oracle用PLSQL连接登录时不显示数据库的解决

    这篇文章主要介绍了装Oracle用PLSQL连接登录时不显示数据库的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 深入探讨:oracle中方案的概念以及方案与数据库的关系

    深入探讨:oracle中方案的概念以及方案与数据库的关系

    本篇文章是对oracle中方案的概念以及方案与数据库的关系进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • SQL中Charindex和Oracle中对应的函数Instr对比

    SQL中Charindex和Oracle中对应的函数Instr对比

    在项目中用到了Oracle中 Instr 这个函数,顺便仔细的再次学习了一下这个知识,使用 Instr 函数对某个字符串进行判断,判断其是否含有指定的字符
    2013-10-10
  • oracle10g发送email示例

    oracle10g发送email示例

    本文介绍了通过Oracle10g发送Email的实例,该Procedure支持中文邮件、HTML代码、多收件人。 ,需要的朋友可以参考下
    2014-01-01
  • Oracle date 和 timestamp 区别详解

    Oracle date 和 timestamp 区别详解

    这篇文章主要介绍了Oracle date 和 timestamp 区别详解的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论