SQL 服务器:根据两个条件重置 运行 总数
SQL SERVER: Reset running total according to two conditions
我需要在满足两个条件时重置 运行 总数。
有关说明,请参阅下面的更新。
使用SQL服务器
Current Table:
item_Number|cartons|average_cartons|running_total|
123456 |.1 |.181818 |.1 |
123456 |.1 |.181818 |.4 |
123456 |.1 |.181818 |.5 |
123456 |.2 |.181818 |.7 |
123456 |.1 |.181818 |.8 |
123456 |.1 |.181818 |.9 |
123456 |.2 |.181818 |1.1 |
123456 |.3 |.181818 |1.4 |
123456 |.7 |.181818 |2.0 |
200000 |3.00 |16.25 |3.0 |
200000 |4.00 |16.25 |7.0 |
200000 |8.00 |16.25 |15.0 |
200000 |1.25 |16.25 |16.25 |
Desired Table:
item_number|cartons|average_cartons|running_total|resetting_total
123456 |0.10 |.181818 |0.1 |0.1
123456 |0.10 |.181818 |0.4 |0.4
123456 |0.10 |.181818 |0.5 |0.5
123456 |0.20 |.181818 |0.7 |0.7
123456 |0.10 |.181818 |0.8 |0.8
123456 |0.10 |.181818 |0.9 |0.9
123456 |0.20 |.181818 |1.1 |0.1
123456 |0.30 |.181818 |1.4 |0.4
123456 |0.70 |.181818 |2.0 |0.0
200000 |3.00 |16.25 |3.0 |3.0
200000 |4.00 |16.25 |7.0 |7.0
200000 |8.00 |16.25 |15.0 |15.0
200000 |1.25 |16.25 |16.25 |0
更新 1:
数据:
数据按项目编号分区并按一年中的星期排序。因此,
- Item_Number = 商品编号。
- 纸箱 = 该周每个商品编号售出的纸箱数。
- Average_cartons = 每周平均售出纸箱数。
- running_total = 运行 周的纸箱总和
商品编号。
- resetting_total=一个item_number的运行箱总和
因为 > average_cartons.
- 群:不知道有没有必要。其他答案包括
一个组变量,用于对组内的所有值求和。我有
还看到了一个缺货的布尔值来完成这个。见:[OOS回答].1
满足以下两个条件时,resetting_total 列将重置。
条件:
running_total > 1。这说明平均值小于值 1。
运行总数>=average_cartons。
我的目标:
- 粗略估计我什么时候需要订购一套纸箱。
假设:
至少订购了 1 箱以达到每周平均值 < 1。
即每个订单将等于average_cartons四舍五入到下一个整数(上限(average_cartons))。
您似乎需要 运行 总数的整数和小数部分。一个简单的方法是:
select floor(running_total) as "group",
(running_total - floor(running_total)) as resetting_total
from t
您可以使用 %
表示第二部分:
select floor(running_total) as "group",
(running_total % 1) as resetting_total
from t
不过,我猜大多数人——包括 SQL 服务器爱好者——会认为这是一个错误,或者至少是相当难以理解的代码。 (frac()
函数会更清楚。)
计算分为两部分。先取最大的1和纸箱的平均值作为约数。换句话说,确保它至少为 1。然后使用模运算计算余数。组号类似,只是商的整数部分,而重置是小数部分。
select
floor(running_total /
case when average_cartons > 1 then average_cartons else 1.0 end) as grp, /* if you need it */
running_total %
case when average_cartons > 1 then average_cartons else 1.0 end as reset_total
from <your query>
我需要在满足两个条件时重置 运行 总数。
有关说明,请参阅下面的更新。
使用SQL服务器
Current Table:
item_Number|cartons|average_cartons|running_total|
123456 |.1 |.181818 |.1 |
123456 |.1 |.181818 |.4 |
123456 |.1 |.181818 |.5 |
123456 |.2 |.181818 |.7 |
123456 |.1 |.181818 |.8 |
123456 |.1 |.181818 |.9 |
123456 |.2 |.181818 |1.1 |
123456 |.3 |.181818 |1.4 |
123456 |.7 |.181818 |2.0 |
200000 |3.00 |16.25 |3.0 |
200000 |4.00 |16.25 |7.0 |
200000 |8.00 |16.25 |15.0 |
200000 |1.25 |16.25 |16.25 |
Desired Table:
item_number|cartons|average_cartons|running_total|resetting_total
123456 |0.10 |.181818 |0.1 |0.1
123456 |0.10 |.181818 |0.4 |0.4
123456 |0.10 |.181818 |0.5 |0.5
123456 |0.20 |.181818 |0.7 |0.7
123456 |0.10 |.181818 |0.8 |0.8
123456 |0.10 |.181818 |0.9 |0.9
123456 |0.20 |.181818 |1.1 |0.1
123456 |0.30 |.181818 |1.4 |0.4
123456 |0.70 |.181818 |2.0 |0.0
200000 |3.00 |16.25 |3.0 |3.0
200000 |4.00 |16.25 |7.0 |7.0
200000 |8.00 |16.25 |15.0 |15.0
200000 |1.25 |16.25 |16.25 |0
更新 1:
数据:
数据按项目编号分区并按一年中的星期排序。因此,
- Item_Number = 商品编号。
- 纸箱 = 该周每个商品编号售出的纸箱数。
- Average_cartons = 每周平均售出纸箱数。
- running_total = 运行 周的纸箱总和 商品编号。
- resetting_total=一个item_number的运行箱总和 因为 > average_cartons.
- 群:不知道有没有必要。其他答案包括 一个组变量,用于对组内的所有值求和。我有 还看到了一个缺货的布尔值来完成这个。见:[OOS回答].1
满足以下两个条件时,resetting_total 列将重置。
条件:
running_total > 1。这说明平均值小于值 1。
运行总数>=average_cartons。
我的目标:
- 粗略估计我什么时候需要订购一套纸箱。
假设:
至少订购了 1 箱以达到每周平均值 < 1。
即每个订单将等于average_cartons四舍五入到下一个整数(上限(average_cartons))。
您似乎需要 运行 总数的整数和小数部分。一个简单的方法是:
select floor(running_total) as "group",
(running_total - floor(running_total)) as resetting_total
from t
您可以使用 %
表示第二部分:
select floor(running_total) as "group",
(running_total % 1) as resetting_total
from t
不过,我猜大多数人——包括 SQL 服务器爱好者——会认为这是一个错误,或者至少是相当难以理解的代码。 (frac()
函数会更清楚。)
计算分为两部分。先取最大的1和纸箱的平均值作为约数。换句话说,确保它至少为 1。然后使用模运算计算余数。组号类似,只是商的整数部分,而重置是小数部分。
select
floor(running_total /
case when average_cartons > 1 then average_cartons else 1.0 end) as grp, /* if you need it */
running_total %
case when average_cartons > 1 then average_cartons else 1.0 end as reset_total
from <your query>