2017-02-14 5 views
3

Я пытаюсь создать запрос, который выполняет вычисления в подзапросе, для которого требуется функция SUM и группа. Мой запрос возвращает ошибку «Subquery возвращает более 1 строки». По сути, я пытаюсь вернуть сумму «Due» для каждого заказа. Если общая сумма заказа больше суммы total_collected (для этого order_id) из таблицы платежей, будет причитаться сумма. Вот запрос:Mysql sub select с SUM() и группой

SELECT o.order_id 
    , o.server 
    , o.subtotal 
    , o.discount 
    , o.tax, o.total 
    , (SELECT (o.total - SUM(p.total_collected)) 
      from orders o 
      join payments p 
       on o.order_id = p.order_id 
     group by p.order_id) as 'Due' 
    FROM orders o 
    join payments p 
    on o.order_id = p.order_id 
WHERE...; 

я не могу включить «p.order_id» в суб выбора, так как он должен содержать только один столбец. Я понимаю, почему я получаю сообщение об ошибке, я просто не знаю, как заставить sub select выполнять только SUM на основе per order_id.

+0

Вы можете включить свой ожидаемый результат? –

+0

См. Http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql- query – Strawberry

ответ

2

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

(Я также добавил SUM вокруг общего порядка, потому что я уверен, что бы дать другую ошибку без него.)

SELECT o.order_id 
    , o.server 
    , o.subtotal 
    , o.discount 
    , o.tax 
    , o.total 
    , (SELECT (SUM(o2.total) - SUM(p.total_collected)) 
      from orders o2 
      JOIN payments p 
       ON o2.order_id = p.order_id 
      WHERE o2.order_id = o.order_id) as 'Due' 
    FROM orders o 
WHERE...; 

Хотя, если настроить это так, что он использует объединение вместо подзапрос, я думаю, вы получите лучшую производительность. Что-то вроде этого:

SELECT o.order_id 
    , o.server 
    , o.subtotal 
    , o.discount 
    , o.tax 
    , o.total 
    , o.total - c.Collected AS 'Due' 
    FROM orders o 
    JOIN (
     SELECT p2.order_id, SUM(p2.total_collected) AS 'Collected' 
      FROM payments p2 
     GROUP BY p2.order_id) AS c 
     ON o.order_id = c.order_id 
WHERE...; 
+1

В подзапросе нет необходимости в соединении. –

+0

Использование дополнительного выбора в JOIN в вашем втором примере отлично работало! Спасибо, Дэвид! – Jdub

1

Вам не нужно подзапрос:

SELECT 
    o.order_id, 
    o.server, 
    o.subtotal, 
    o.discount, 
    o.tax, 
    o.total, 
    o.total - ifnull(sum(p.total_collected),0) As Due 
FROM orders AS o 
LEFT JOIN payments AS p ON o.order_id = p.order_id 
WHERE ... 
GROUP BY o.order_id 

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

  • Нет связанных вопросов^_^