mysql - 通过基于产品 ID 的销售价格获得最后一次购买价格的利润,销售日期
问题描述
我正在尝试优化我当前的查询,该查询根据上次购买的净额计算利润,具体取决于产品的销售日期和销售表中的数量。目前,它消耗了太多的内存和时间。
Spacking 是物品的销售单位。例如,如果 x 产品的 spacking 是 10,这意味着它可以分 10 件出售,或者假设一个盒子包含 10 件商品,但我们将其计算为 1 盒,但我们也将其出售,因此 spacking 将是 10对于那个项目。那么每单位该项目的净数量将是 net_amount/spacking。
在嵌套查询中,我通过((该产品 id 的总数量/数量))/spacking 计算一个单位的价格,并将其乘以当前销售数量,然后从总销售价格中减去它会给我该产品的利润。
产品
pcode (varchar(10)) | 产品名称 (varchar(50)) | 间距(int) | 价格(双) |
---|---|---|---|
1343 | 巧克力盒 | 10 | 20 美元 |
1344 | Panadol 地带 | 1 | 10 美元 |
1345 | 神经元注射液 | 5 | 2美元 |
购买
Product_code(FKey - 产品的 pcode) | 日期(日期) | Full_item (int) | 件数(整数) | 奖金(整数) | 折扣(双) | 净额/总金额(双倍) |
---|---|---|---|---|---|---|
1343 | 23-03-2021 | 10 | 0 | 2 | 2% | 130 美元 |
1343 | 22-03-2021 | 10 | 0 | 1 | 2% | 130 美元 |
1344 | 22-03-2021 | 5 | 0 | 5% | 15 美元 | |
1344 | 1-03-2021 | 5 | 0 | 5% | 10 美元 | |
1343 | 22-03-2021 | 10 | 0 | 1 | 2% | 130 美元 |
1343 | 21-03-2021 | 10 | 0 | 0 | 2% | 130 美元 |
销售
Product_code(FKey - 产品的 pcode) | 日期(日期) | Full_item (int) | 件数(整数) | 奖金(整数) | 折扣(双) | 净额/总金额(双倍) |
---|---|---|---|---|---|---|
1343 | 23-03-2021 | 2 | 0 | 0 | 0% | 40 美元 |
1344 | 22-03-2021 | 1 | 0 | 0 | 0% | 10 美元 |
1343 | 21-03-2021 | 1 | 0 | 0 | 0% | 20 美元 |
1343 | 22-03-2021 | 0 | 9 | 0 | 0% | 18 美元 |
1343 | 21-03-2021 | 1 | 0 | 0 | 0% | 20 美元 |
在销售中,我为购买的每件商品添加了所有销售交易,每天它可能有不同的购买价格,为了获得利润,我们必须从一件商品的最新购买价格中减去销售价格。因此,日期在这里也起到了提取确切利润的作用,因为一件商品的销售可能来自不同的日期。
因此,我在下面编写了一个查询,它获取所有销售记录以及每个产品的利润。
一天,461 行,查询耗时 4.2298 秒。对于多天的记录,需要很长时间才能处理。
select
product.product_name,
product.pcode,
product.spacking,
(
select
round(sale.net_amount - ( (round((p.net_amount / (p.full_item + p.bonus_full)), 2) / product.spacking)* ((sale.full_item + sale.bonus_full)* product.spacking ) + (round((p.net_amount / (p.full_item + p.bonus_full)), 2) / product.spacking)* (sale.pieces)), 2
)
from
purchase p
where
p.invoice_date <= sale.invoice_date
and sale.product_code = p.product_code
order by
p.invoice_date desc LIMIT 1)) as pnet_amount,
DATE_FORMAT(sale.invoice_date, '%M %d %Y') as date,
sale.invoice_number,
sale.full_item,
sale.pieces,
sale.bonus_full_item,
sale.price,
sale.discount,
sale.net_amount
from
sale
join
product
on product.pcode = sale.product_code
join
customer
on customer.ccode = sale.customer_code
where
sale.invoice_date BETWEEN '2021-03-14' and '2021-03-16'
order by
sale.invoice_date desc
解决方案
推荐阅读
- django - 当我在 serializers.py 中明确将其定义为 html 时,为什么 HyperlinkedIdentityField 页面的格式参数设置为“api”
- php - 数据未存储在数据库中
- android - 如果我添加
对于 android.hardware.camera2.full 我应该删除 android.hardware.camera - jquery - 引导折叠功能似乎在这里不起作用。有什么我看不到的吗?
- apache-spark - apache spark中的上一项搜索
- python - 看似相似的代码行的不同输出。为什么?
- css - nth-child td 宽度拉伸其他元素?
- node.js - 如何使用节点的 child_process 库在 mac 上启动交互式终端窗口?
- python - 如何逐行(逐行)从磁盘读取numpy数组?
- rx-java2 - onErrorResumeNext 类型推断失败