具有分组和按日期排序的复杂 sum()
Posted
技术标签:
【中文标题】具有分组和按日期排序的复杂 sum()【英文标题】:Complicated sum() with group and order by date 【发布时间】:2013-11-09 09:11:28 【问题描述】:有两个表:
* ORDER
- id
- pay_type
* ORDER_PRICE
- order_id
- dt
- price
可以更改订单价格,例如:
order_id | price | dt
1 | 100.3 | 2013-10-25
1 | 105.7 | 2013-10-28
2 | 207.4 | 2013-09-13
4 | 98.0 | 2013-10-03
我可以选择任何日期的价格历史记录:
SELECT
o.`id`,
(SELECT op.`price` FROM `order_price` op
WHERE op.`order_id`=o.`id` AND op.`dt` <= '2013-10-26'
ORDER BY op.`dt` DESC LIMIT 1) order_price
FROM `order` o
它给了我给定日期的正确价格
order_id | price | dt
1 | 100.3 | 2013-10-25
2 | 207.4 | 2013-09-13
4 | 98.0 | 2013-10-03
但我需要第二列的总和(无论什么订单号,只有一个数字 - 在这种情况下为 405.7)。
这种情况有解决办法吗?可能有数千个订单,所以我认为在mysql之外汇总记录是错误的。也许从一开始就是错误的,我需要其他结构?感谢您的时间和帮助。
【问题讨论】:
在尝试之前,我想知道为什么您需要所有历史变化价格的总和。这些信息有什么意义? 这个查询产生两列,而不是三列。 另外,为什么订单的价格会发生变化?订单是时间上的个体实体,应该有一个固定的价格 OP 想要以“当前”价格计算所有订单的总和 是的,第三列是我的错 - 它更虚拟,在此处作为行注释添加。 【参考方案1】:我怀疑核心查询应该更像这样......
SELECT o.order_id
, op.price
, op.dt
FROM orders o
JOIN order_price op
ON op.order_id = o.order_id
JOIN
( SELECT order_id, MAX(dt) max_dt FROM order_price WHERE dt < '2013-10-26' GROUP BY order_id ) x
ON x.order_id = op.order_id
AND x.max_dt = op.dt;
...可以这样重写,给出总数
SELECT o.order_id
, SUM(op.price) price
, op.dt
FROM orders o
JOIN order_price op
ON op.order_id = o.order_id
JOIN
( SELECT order_id, MAX(dt) max_dt FROM order_price WHERE dt < '2013-10-26' GROUP BY order_id ) x
ON x.order_id = op.order_id
AND x.max_dt = op.dt
GROUP
BY order_id,dt
WITH ROLLUP;
...或者这样
SELECT SUM(price) total
FROM
( SELECT o.order_id
, op.price
, op.dt
FROM orders o
JOIN order_price op
ON op.order_id = o.order_id
JOIN
( SELECT order_id, MAX(dt) max_dt FROM order_price WHERE dt < '2013-10-26' GROUP BY order_id ) x
ON x.order_id = op.order_id
AND x.max_dt = op.dt
) z;
...或者只是在应用程序级别提取总数。
【讨论】:
以上是关于具有分组和按日期排序的复杂 sum()的主要内容,如果未能解决你的问题,请参考以下文章