2010-11-06 2 views
0

У меня есть две таблицы в отношениях друг к другу. В частности, t1 - информация о заказе, а t2 - данные позиции по этим заказам.Как я могу использовать SUM и COUNT в том же запросе с mysql и получать точные результаты

Я пытаюсь использовать запрос, как это:

SELECT COUNT(DISTINCT(t1.id)) order_count, 
      SUM(t1.order_total) order_total, 
      SUM(t2.product_price) product_total, 
      DATE(t1.order_date) order_date 
    FROM t1 
LEFT JOIN t2 ON t1.id = t2.id 
GROUP BY t1.order_date 

Запрос возвращает правильное значение для order_count. Однако другие значения завышены неправильно. Я понимаю, что с левым соединением я добавляю дополнительные строки, и поэтому сумма неверна. Я просто не знаю, как это исправить.

Любая помощь была бы принята с благодарностью.

EDIT: Вывод должен быть чем-то вроде этого:

ДАТА | ПОРЯДОК ЗАКАЗА | GRAND TOTAL

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

SELECT 
COUNT(DISTINCT(o.order_number)) order_count, 
DATE(o.order_date) order_date, 
SUM(o.total_product_total) product_total, 
SUM(o.total_shipping) shipping_total, 
SUM(o.total_grand_total) grand_total, 
o.coupon_total 
FROM (
SELECT 
DATE(o.order_date) order_date, 
o.order_number, 
o.total_product_total, 
o.total_shipping, 
o.total_grand_total, 
IF(op.record_type='cpn',SUM(op.price),0) coupon_total 
FROM orders o 
LEFT JOIN orders_products op ON o.order_number=op.order_number 
GROUP BY o.order_number 
) o 
GROUP BY DATE(o.order_date) 
ORDER BY o.order_date DESC 
+0

Выборочные данные могут помочь –

+0

Почему вы группировки по дате, но не выбрав его? Неясно, как вы ХОТИТЕ этот запрос вернуться! –

ответ

2

Я хотел бы использовать подзапрос к первой сумме по значениям субтаблицы как

SELECT t1.id, t1.order_total, SUM(t2.product_price) product_total 
FROM t1 LEFT JOIN t2 on t1.id=t2.id 
GROUP BY t1.id, t1.order_total 

этот запрос возвращает все разовые заказы с их суммированной ценой продукта.

сделать внешний запрос суммируя по order_total и не возвращая количество как

SELECT COUNT(DISTINCT(t1.id)) order_count, 
     SUM(t1.order_total) order_total, 
     SUM(t2.product_price) product_total 
FROM (
    SELECT t1.order_date, t1.id, t1.order_total, SUM(t2.product_price) product_total 
    FROM t1 LEFT JOIN t2 on t1.id=t2.id 
    GROUP BY t1.order_date, t1.id, t1.order_total 
) GROUP BY t1.order_date 

Нет garantuee, что этот код на самом деле работает, мой SQL немного ржавая ... Но я надеюсь, что вы получили эту идею.

EDIT (в ответ на ваши изменения ...)

IF -construct неуместен в вашем коде: Либо вы используете что-то вроде SUM(IF(op.record_type='cpn',op.price,0)) или, что еще лучше, поместить пункт WHERE во внутреннем запросе выбирая только ФОС с record_type='cpn', то есть сделать его

.... 
SUM(op.price) coupon_total 
FROM orders o 
LEFT JOIN orders_products op ON o.order_number=op.order_number 
WHERE op.record_type='cpn'` 
GROUP BY o.order_number 
.... 
+0

Я мог бы реализовать это, но я не решаюсь использовать его, потому что я не понимаю, как он работает и что именно он делает, и как его изменить или исправить в будущем, если с ним что-то пойдет не так. – JungAtHeart

+0

Подумайте о первом (суб) запросе в качестве промежуточной таблицы, которая содержит все заказы и их соответствующие итоговые суммы (т. Е. Суммирование только по 't2'). Второй (внешний) запрос использует это и вычисляет оставшиеся суммы/счета. Так как для каждого порядка в подзапросе есть только одна строка, сумма над 'order_total' должна быть выполнена правильно. – MartinStettner

+0

Я выполнил запрос, похожий на ваш. Результаты почти точны. Изменения в моем первоначальном вопросе объясняют больше. – JungAtHeart

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