2014-11-21 2 views
0

я эта таблица информации, содержащую порядка для двух заказов (orderID 1 и orderID 2):Как правильно SUM() в моем запросе?

┌--------------------------------------┐ 
| orderID | productID | amount | price | 
├--------------------------------------┤ 
|  1 |   1 |  5 | 19.95 | 
|  1 |   2 |  2 | 12.95 | 
|  1 |   3 | NULL | 3.49 | 
|  1 |   4 | NULL | 1.49 | 
|  1 |   5 | NULL | 0.99 | 
|  2 |   1 |  11 | 19.95 | 
|  2 |   2 |  4 | 12.95 | 
|  2 |   3 | NULL | 3.49 | 
└--------------------------------------┘ 

идентификаторов продуктов 1 и 2 являются предметами, где заказчик может выбрать произвольное количество элементов.

Все продукты с идентификаторами свыше 2 являются обновлениями к продукту ID 1, поэтому заказчик не может выбрать сумму, но только выбрал ее или не выбрал.

Теперь я хочу рассчитать окончательный SUM() каждого заказа.

Правильная формула для первого заказа будет

5 * 19.95 
+ 2 * 12.95 
+ 5 * 3.49 
+ 5 * 1.49 
+ 5 * 0.99 
----------- 
= 155.50 

Так что я начал определять мой запрос, как это:

SELECT 
    `orderID`, 
    SUM(
     CASE 
      WHEN `amount` IS NOT NULL 
      THEN `amount` * `price` 
      ELSE `price` 
     END 
    ) AS `total` 
FROM `orders` 
GROUP BY `orderID` 

Но проблема теперь, что все дополнительные элементы (с productID > 2) подсчитываются только один раз, но я нуждаюсь в них столько раз, сколько выбрано productID 1. Как я могу получить доступ к amount из productID 1 в моем запросе?

ответ

2

Я думаю, вам нужно присоединиться. Что-то вроде этого: -

SELECT a.OrderID, SUM(COALESCE(a.amount, b.amount) * a.price) 
FROM orders a 
INNER JOIN orders b 
ON a.OrderID = b.OrderID 
AND b.ProductID = 1 
GROUP BY a.OrderID 
+0

Мне сложно понять почему, но это работает; благодаря! –

+0

Он присоединяется к таблице против себя. Или заказы (a) - это каждая строка, а заказы (b) - это только первый идентификатор продукта для этого порядка. Coalesce дает первое непустое значение, поэтому, если a имеет сумму, которую он использует, но если он не использует сумму из b. – Kickstart

+0

Я вижу, потрясающе! Большое спасибо! –

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