【发布时间】:2020-02-27 23:34:58
【问题描述】:
我的表schema如下:
索引:
- products.id 主键
- products.description 唯一
- expenses.id 主键
- expenses.product_id product.id 的外键
我的目标是加载
- 当月每种产品的成本(AS cost_november)
- 上个月每种产品的成本(AS cost_october)
- 当月成本与上月相比的变化
(当月成本 - 上月成本)(AS 成本) - 当月费用与上一月相比的百分比变化
(上月费用 * 100 / 当月费用)(AS percent_diff)
我已经编写了完全符合此功能的 SQL:
SELECT description, (SUM(cost) - IFNULL(
(
SELECT SUM(cost)
FROM expenses
WHERE month = 9 AND year = 2019 AND product_id = e.product_id
GROUP BY product_id
), 0)) AS costs,
SUM(cost) * 100 /
(
SELECT SUM(cost)
FROM expenses
WHERE month = 9 AND year = 2019 AND product_id = e.product_id
GROUP BY product_id
) AS percent_diff,
SUM(cost) AS costs_october,
IFNULL(
(
SELECT SUM(cost)
FROM expenses
WHERE month = 9 AND year = 2019 AND product_id = e.product_id
GROUP BY product_id
), 0) AS costs_september
FROM expenses e
JOIN products p ON (e.product_id = p.id)
WHERE month = 10 AND year = 2019
GROUP BY product_id
ORDER BY product_id;
但是将相同的子查询复制粘贴三次真的是解决方案吗?理论上,每个产品需要运行四个查询。有没有更优雅的方式?
感谢您的帮助!
【问题讨论】:
-
您从未有过月内成本变化吗?
-
请列出您目前拥有的索引。
-
@P.Salmon 费用/成本以后不会改变。
标签: mysql sql join query-optimization innodb