2013-11-09 3 views
0

Есть две таблицы:Сложное сумма() с группой и порядке по дате

* 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. Может, с самого начала это не так, и мне нужна другая структура? Спасибо за ваше время и помощь.

+0

перед тем, как попробовать, я хотел бы знать, почему вам нужна сумма всех исторически измененных цен. в чем смысл этой информации? – Alp

+0

Этот запрос создает два столбца, а не три. – Strawberry

+0

также, почему может измениться цена заказа? заказы являются отдельными субъектами во времени и должны иметь фиксированную цену – Alp

ответ

0

Я подозреваю, что основной запрос должен выглядеть следующим образом ...

 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; 

... или просто вытащить общее количество на уровне приложения.

+0

Я пробовал последний пример, и он работает для меня, спасибо – user2971484

Смежные вопросы