左联接-左联接返回空结果作为付款方式

时间:2018-07-01 20:41:24

标签: mysql sql join left-join

这是我关于stackoverflow的第一个问题,所以我尽力避免搞砸。我在这个查询上花了几个小时,无法取得任何进展。

我使用的视图中包含多个预订。所有这些预订都有付款方式,例如贝宝或信用卡。

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

通过我的SQL查询,我试图获取所有Payment_method的总和。不幸的是,本月未使用的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') 

*编辑* m0lochwalker指出我应该使用GROUP BY子句...我有它,但是它在复制和粘贴操作期间得到。这里是。

GROUP BY PaymentMethods.Methods ORDER BY PaymentMethods.Methods DESC

2 个答案:

答案 0 :(得分:2)

当外部联接记录时,它们的值为空:

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;

(如您所见,COALESCEIFNULL属于SUM而不位于其中,因为如果 sum 为空,则您要替换它零)。

答案 1 :(得分:0)

您的结果就是LEFT JOIN会做的。您应该对TotalQuantity和Group By payment_method求和。您是否查看过Group By子句?像这样:

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