新手求助sql,数量随机分摊的问题

aladdinisme 2023-03-22 14:37:48

最近在学sql,碰上一个问题,就是我有张表spzl,里面有这个商品活动时间,每组可销售的最大值和最小值,活动要求的总数量,现在需要把这个总数量随机分配到活动时间内,该怎么写比较好呢?

例如:1.a商品活动时间为3月1日-3月7日共7天,活动要求的总数量是300,现需要把300的数量随机分到7天中

           2.然后再通过可销售的最大值4,最小值2计算出每天最多能销售几组,剩下不能整除的零头做一组

总数量300 时间3-13-7活动天数7
        
天数1234567
随机分摊数量36414845343660
最大销售组数1820+12422+1171830
最小销售组数910+11211+18+1915

 

...全文
289 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_32606625 2023-03-22
  • 打赏
  • 举报
回复 1

CREATE TABLE spzl (
id INT PRIMARY KEY,
start_date DATE,
end_date DATE,
total_amount INT,
max_sellable INT,
min_sellable INT,
days INT,
random_amounts VARCHAR(50),
max_sellable_counts VARCHAR(50),
min_sellable_counts VARCHAR(50)
);
其中,各个字段的含义如下:

id:商品的唯一标识,可以使用自增的整数。
start_date:商品活动的开始日期,使用 DATE 类型存储。
end_date:商品活动的结束日期,使用 DATE 类型存储。
total_amount:商品活动的总数量。
max_sellable:每组商品可销售的最大数量。
min_sellable:每组商品可销售的最小数量。
days:商品活动的天数,可以通过计算 start_date 和 end_date 之间的天数得到。
random_amounts:将商品活动总数量随机分配到每天的数量,使用 VARCHAR 类型存储,例如 "36,41,48,45,34,36,60"。
max_sellable_counts:每天最多能销售的组数,使用 VARCHAR 类型存储,例如 "18,20+1,24,22+1,17,18,30"。
min_sellable_counts:每天最少能销售的组数,使用 VARCHAR 类型存储,例如 "9,10+1,12,11+1,8+1,9,15"。
-- 计算商品活动时间的天数
UPDATE spzl SET days = DATEDIFF(end_date, start_date) + 1;

-- 计算每天的随机分配数量
UPDATE spzl
SET daily_quantity = FLOOR(quantity / days),
remaining_quantity = quantity - FLOOR(quantity / days) * days;

-- 随机分配每天的数量
INSERT INTO spzl_random (id, date, quantity)
SELECT id,
DATE_ADD(start_date, INTERVAL seq DAY) AS date,
IF(seq < remaining_quantity, daily_quantity + 1, daily_quantity) AS quantity
FROM spzl
JOIN (SELECT 0 AS seq UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7) AS seq
ON seq < days;

-- 计算每天最多和最少能销售的商品组数
SELECT date,
CEIL(quantity / max_sale) AS max_sale_num,
FLOOR(quantity / min_sale) AS min_sale_num
FROM (
SELECT date,
SUM(quantity) AS quantity,
MAX(max_sale_quantity) AS max_sale,
MIN(min_sale_quantity) AS min_sale
FROM (
SELECT date,
SUM(quantity) AS quantity,
MAX(daily_quantity) AS max_sale_quantity,
MIN(daily_quantity) AS min_sale_quantity
FROM spzl_random
GROUP BY date
) AS t1
JOIN spzl ON t1.id = spzl.id
GROUP BY date
) AS t2;
第一个 UPDATE 语句计算商品活动时间的天数,并将其存储在 spzl 表中的一个名为 days 的新列中。

第二个 UPDATE 语句根据总数量和天数计算出每天的随机分配数量,并将其存储在 spzl 表中的一个名为 daily_quantity 的新列中。同时,它还计算出剩余数量 remaining_quantity。

INSERT INTO 语句将每天的随机分配数量存储在一个名为 spzl_random 的新表中,其中使用了 IF 函数来处理剩余数量
condition 是一个逻辑表达式或值,如果为 TRUE,则返回 value_if_true,否则返回 value_if_false。
value_if_true 是当 condition 为 TRUE 时返回的值。
value_if_false 是当 condition 为 FALSE 时返回的值。
在上面的 SQL 语句中,condition 就是 seq < remaining_quantity,即当前日期的序号是否小于剩余数量;value_if_true 是 daily_quantity + 1,即如果当前日期的序号小于剩余数量,则返回 daily_quantity + 1;value_if_false 是 daily_quantity,即如果当前日期的序号大于等于剩余数量,则返回 daily_quantity。

aladdinisme 2023-03-22
  • 举报
回复
@qq_32606625 谢谢您的回复,还想请问一下,这个随机数是平均数?不是随机的?

5,891

社区成员

发帖
与我相关
我的任务
社区描述
IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本
社区管理员
  • DB2
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧