Это мой первый вопрос о 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
Когда вы записываете внешние записи, их значения равны нулю:
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
не внутри него, потому что если сумма равна нулю, вы хотите заменить ее нулем.)
Ваш результат - это то, что сделает LEFT JOIN. Вы должны SUM TotalQuantity и Group Pay_method. Вы посмотрели предложение Group By? Что-то вроде:
SELECT payment_method, sum(totalquantity) as qty
FROM myTable
GROUP BY payment_method
FROM PaymentMethods LEFT JOIN PaymentMethods
должны бытьFROM PaymentMethods LEFT JOIN SlotBookingsFullView
.