首页 > 试题广场 >

统计每个产品的销售情况

[编程题]统计每个产品的销售情况
  • 热度指数:28909 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
数据查询需求说明
为了对每个产品的营销进行新的策划,需要统计2023年每个产品的销售情况。现有三个原始数据表格:customers(顾客)、products(产品)和orders(订单),其结构如下:

  customers(顾客)
字段名 数据类型 说明
customer_id(顾客ID) 整数 顾客的唯一标识符
customer_name(顾客姓名) 字符串(最大长度50) 顾客的姓名
customer_email(顾客邮箱) 字符串(最大长度50) 顾客的电子邮箱地址
customer_age(顾客年龄) 整数 顾客的年龄
PRIMARY KEY (customer_id) - 将customer_id设置为主键,确保每个顾客ID的唯一性。
products(产品)
字段名 数据类型 说明
product_id(产品ID) 整数 产品的唯一标识符
product_name(产品名称) 字符串(最大长度50) 产品的名称
unit_price(单价) 十进制数(保留两位小数) 产品的单价
PRIMARY KEY (product_id) - 将product_id设置为主键,确保每个产品ID的唯一性。
orders(订单)
字段名 数据类型 说明
order_id(订单ID) 整数 订单的唯一标识符
customer_id(顾客ID) 整数 顾客的ID,对应customers表格中的customer_id
product_id(产品ID) 整数 产品的ID,对应products表格中的product_id
quantity(数量) 整数 产品的数量
order_date(订单日期) 日期 订单的日期
PRIMARY KEY (order_id) - 将order_id设置为主键,确保每个订单ID的唯一性。

查询要求

根据上述表格,查询2023年每个产品的以下信息:

  • 产品IDproduct_id):产品的ID。
  • 总销售额total_sales):该产品的2023年总销售额。
  • 单价unit_price):产品的单价。
  • 总销量total_quantity):该产品的2023年总销售数量。
  • 月平均销售额avg_monthly_sales):2023年该产品的月均销售额。
  • 单月最高销量max_monthly_quantity):2023年该产品的最大月销售数量。
  • 购买量最多的客户年龄段customer_age_group):2023年购买该产品数量最多的顾客的年龄段(1-10,11-20,21-30,31-40,41-50,51-60,61+


排序规则

  • 按照每个产品的总销售额降序排列。
  • 如果总销售额一致,则按照产品的ID升序排列。
  • 当存在两个客户年购买量都是最高时,customer_age_group展示年龄小的顾客的年龄段。


计算说明

  • 总销售额 = 总销量 × 单价
  • 月平均销售额 = 总销售额 / 12
  • 所有计算结果保留两位小数。

【示例】
customers(顾客)表格

products(产品)表格

orders(订单)表格

按要求查询出来的结果

示例说明

假设产品104的2023年销售总量是6,单价是120.00,则:

  • 总销售额 = 6 × 120 = 720.00
  • 月平均销售额 = 720 / 12 = 60.00
  • 购买量最大的客户ID是2的Bob,年龄是30,所在年龄段是21-30。



示例1

输入

drop table if exists customers ;
drop table if exists products ;
drop table if exists orders ;
CREATE TABLE customers (
    customer_id INT,
    customer_name VARCHAR(50),
    customer_email VARCHAR(50),
    customer_age INT,
    PRIMARY KEY (customer_id)
);

INSERT INTO customers (customer_id, customer_name, customer_email, customer_age) VALUES
(1, 'Alice', 'alice@example.com', 25),
(2, 'Bob', 'bob@example.com', 30),
(3, 'Charlie', 'charlie@example.com', 22),
(4, 'David', 'david@example.com', 18),
(5, 'Eve', 'eve@example.com', 35);

CREATE TABLE products (
    product_id INT,
    product_name VARCHAR(50),
    unit_price DECIMAL(10, 2),
    PRIMARY KEY (product_id)
);

INSERT INTO products (product_id, product_name, unit_price) VALUES
(101, 'Product A', 50.00),
(102, 'Product B', 75.00),
(103, 'Product C', 100.00),
(104, 'Product D', 120.00),
(105, 'Product E', 90.00);

CREATE TABLE orders (
    order_id INT,
    customer_id INT,
    product_id INT,
    quantity INT,
    order_date DATE,
    PRIMARY KEY (order_id)
);

INSERT INTO orders (order_id, customer_id, product_id, quantity, order_date) VALUES
(1, 1, 101, 2, '2023-01-15'),
(2, 2, 102, 3, '2023-02-20'),
(3, 3, 103, 1, '2023-03-10'),
(4, 4, 104, 2, '2023-04-05'),
(5, 5, 105, 4, '2023-05-12'),
(6, 1, 102, 2, '2023-06-18'),
(7, 2, 103, 3, '2023-07-22'),
(8, 3, 104, 1, '2023-08-30'),
(9, 4, 105, 2, '2023-09-14'),
(10, 5, 101, 4, '2023-10-25'),
(11, 1, 103, 2, '2023-11-08'),
(12, 2, 104, 3, '2023-12-19');

输出

product_id|total_sales|unit_price|total_quantity|avg_monthly_sales|max_monthly_quantity|customer_age_group
104|720.00|120.00|6|60.00|3|21-30
103|600.00|100.00|6|50.00|3|21-30
105|540.00|90.00|6|45.00|4|31-40
102|375.00|75.00|5|31.25|3|21-30
101|300.00|50.00|6|25.00|4|31-40
头像 稚名_
发表于 2025-03-22 14:43:48
with t1 as ( # 把主要数据进行查询 select p.product_id, sum(quantity * unit_price) as total_sales, unit_price, sum(quantity) 展开全文
头像 白加黑__
发表于 2025-04-01 20:26:24
WITH t1 AS( SELECT DISTINCT p.product_id, SUM(o.quantity * unit_price) total_sales, p.unit_price, SUM(o.quantity) total_quantity, 展开全文
头像 牛客963740689号
发表于 2025-03-19 15:56:21
/* --t1筛选出前5列,t2先按product_id,month(order_date)统计出各商品的最大月销售量 --t3使用窗口函数ROW_NUMBER按最大月销量进行DESC排序,便于最后挑选出最大月销量 --t4先按product_id,customer_id统计出各商品的每个客户的年购 展开全文
头像 正在背八股的里根很爱吃
发表于 2025-07-28 02:27:12
解题思路整理1.组宽表2.需求字段拆解:含义,计算逻辑,涉及字段,整理等3.集合临时表取数初学者,本文有任何不妥,错误的地方,希望得到同学们的指点,以期进步,感恩。步骤n个临时表计算,最后聚合取数。1.组宽表:筛选,取数(排除重复列),之后所有的表都可以from ‘宽表’,减少重复代码,也不会遗漏筛 展开全文
头像 白加黑__
发表于 2025-05-15 17:29:33
WITH t0 AS( SELECT product_id, MAX(month_sales) max_monthly_quantity FROM (SELECT product_id, SUBSTRING(order_date,1,7) m 展开全文
头像 Mide666
发表于 2025-06-05 14:40:03
#目前只会无限套娃,调试了快2小时记录下。。。 select t5.product_id, t5.total_sales, t5.unit_price, t5.total_quantity, t5.avg_monthly_sales, t5.max_m 展开全文
头像 stf666
发表于 2025-10-21 17:29:47
/*借这道题好好体会cte,明确每一列从哪个表取更不容易出错*/ with details1 as ( /*第一个步骤表要加with,步骤表之间用逗号连接,注意计算结果都要保留两位小数*/ select p.product_id ,round(sum(p.unit_price*o.quant 展开全文
头像 灼灼月光x
发表于 2025-08-09 23:07:29
with total_sales as (select o.product_id,round(sum(o.quantity*p.unit_price),2) as total_sales,p.unit_price,sum(o.quantity) as total_quantity, round(s 展开全文
头像 牛客237430026号
发表于 2025-10-05 10:47:42
with zw as( select o.product_id, sum(unit_price*quantity) as total_sales, sum(quantity) as total_quantity from orders o join 展开全文
头像 存几分期许
发表于 2025-08-10 01:46:05
with t as ( select a.product_id, unit_price*quantity as sales, unit_price, quantity, order_date, case when customer_age>=1 and custo 展开全文