LEFT JOIN - вернуть пустые результаты с левым соединением на сумму payment_method

0

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

Я использую представление, в котором есть несколько заказов. Все эти заказы имеют pay_method, например paypal или кредитную карту.

Customer Name | Price | payment_method
John Doe      |  20   |  creditcard
Susan Soe     |  10   |  paypal

С моим sql-запросом я пытаюсь получить суммы для всех методов payment_methods. К сожалению, платежные методы, которые не использовались в этом месяце, не отображаются.

Поэтому я создал дополнительную таблицу под названием PaymentMethods с помощью столбца "Методы".

Methods
creditcard
premium
sofort
bank
paypal

Затем я попытался использовать LEFT JOIN чтобы получить такой результат:

payment_method  | TotalQuantity (->sum(price))
creditcard      | 20
premium         | 0
sofort          | 0
bank            | 0
paypal          | 10

Но вместо этого я получаю только те возвращенные суммы, которые уже используют этот метод payment_method.

payment_method  | TotalQuantity (-> sum(price))
creditcard      | 20
paypal          | 10

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

SELECT payment_method, SUM(IFNULL(price,0)) AS TotalQuantity 
FROM PaymentMethods 
LEFT JOIN PaymentMethods
ON SlotBookingsFullView.payment_method=PaymentMethods.Methods
WHERE (booking_date BETWEEN '2018-07-01 00:00:00' AND '2018-07-30 23:59:59') 

* EDIT * m0lochwalker указал, что я должен использовать предложение GROUP BY... У меня было это, но оно получилось во время копирования и вставки. Вот.

GROUP BY PaymentMethods.Methods ORDER BY PaymentMethods.Methods DESC
  • 0
    Ваш результат - то, что сделал бы ЛЕВОЕ СОЕДИНЕНИЕ. Вы должны SUM TotalQuantity и Group By payment_method. Вы смотрели на предложение Group By? Что-то вроде:
  • 0
    В вашем запросе есть еще одна опечатка: FROM PaymentMethods LEFT JOIN PaymentMethods должны быть FROM PaymentMethods LEFT JOIN SlotBookingsFullView .
Теги:
join
left-join

2 ответа

1

Когда вы записываете внешние записи, их значения равны нулю:

PaymentMethods.Methods  | B.payment_method  | B.booking_date   | B.Quantity
------------------------+-------------------+------------------+-----------
creditcard              | creditcard        | 2018-07-01       | 2
creditcard              | creditcard        | 2018-07-05       | 1
creditcard              | creditcard        | 2018-04-21       | 4
premium                 | NULL              | NULL             | NULL
...

Таким образом, с

WHERE (SlotBookingsFullView.booking_date BETWEEN '2018-07-01 00:00:00'
                                             AND '2018-07-30 23:59:59')

вы отклоняете все внешние строки, потому что их booking_date не находится в желаемом диапазоне дат, но, очевидно, имеет значение null. Это делает ваше соединение простым внутренним соединением. Положите критерии на внешние соединения в своем предложении ON:

SELECT pm.Methods, COALESCE(SUM(b.Price), 0) AS TotalQuantity 
FROM PaymentMethods pm
LEFT JOIN SlotBookingsFullView b
  ON  b.payment_method = pm.Methods
  AND b.booking_date >= date '2018-07-01'
  AND b.booking_date <  date '2018-07-31' 
GROUP BY pm.Methods
ORDER BY pm.Methods DESC;

(Как вы видите, COALESCE или IFNULL принадлежит вне SUM не внутри него, потому что если сумма равна нулю, вы хотите заменить ее нулем.)

  • 0
    Ваше решение работает просто отлично! Также спасибо за объяснение Торстена!
0

Ваш результат - это то, что сделает LEFT JOIN. Вы должны SUM TotalQuantity и Group Pay_method. Вы посмотрели предложение Group By? Что-то вроде:

SELECT payment_method, sum(totalquantity) as qty
FROM myTable 
GROUP BY payment_method
  • 0
    Спасибо за ваш ответ. Ты прав. Требуется GROUP BY, и я уже это сделал, но потерял при копировании. Смотрите редактировать. Что я не понимаю в вашем ответе, так это то, как сумма (totalqantity) должна работать. totalquantity - это не столбец, а «переменная».
  • 0
    Я был на мобильном телефоне и быстро читал. Думаю, я мог бы помочь, предложив Group By. Рад, что ты получил это работает.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню