LEFT JOIN - вернуть пустые результаты с левым соединением на сумму payment_method - PullRequest
0 голосов
/ 01 июля 2018

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

Я использую вид, в котором есть несколько бронирований. Все эти заказы имеют метод payment_method, например PayPal или кредитная карта.

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

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

Итак, я создал дополнительную таблицу с именем PaymentMethods со столбцом Methods.

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') 

* РЕДАКТИРОВАТЬ * m0lochwalker указал, что я должен использовать предложение GROUP BY ... У меня было это, но оно получилось во время действия копирования и вставки. Вот.

GROUP BY PaymentMethods.Methods ORDER BY PaymentMethods.Methods DESC

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

При внешнем соединении записей их значения равны нулю:

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 находится не в желаемом диапазоне дат, но, очевидно, равно нулю. Это делает ваше соединение простым внутренним соединением. Вместо этого укажите критерии для внешних объединений в их предложении 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, а не внутри него, потому что если sum равна нулю, вы хотите заменить его на ноль.)

0 голосов
/ 02 июля 2018

Ваш результат - то, что сделает ЛЕВОЕ СОЕДИНЕНИЕ. Вы должны SUM TotalQuantity и Group By payment_method. Вы смотрели на предложение Group By? Что-то вроде:

SELECT payment_method, sum(totalquantity) as qty
FROM myTable 
GROUP BY payment_method
...