left join-返回空结果,其中left join为sum of payment\u方法

o7jaxewo  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(352)

这是我关于堆栈溢出的第一个问题,所以我尽量不要搞砸了。我在这个问题上绞尽脑汁了几个小时,没有任何进展。
我使用的视图中有多个预订。所有这些预订都有付款方式,如贝宝或信用卡。

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

通过我的sql查询,我试图得到所有付款方法的总和。不幸的是,本月没有使用的付款方式没有出现。
所以我用column方法创建了一个额外的表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  | 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
afdcj2ne

afdcj2ne1#

你的结果就是左连接的结果。你应该按付款方式和总数量和分组。你看过GROUPBY子句了吗?比如:

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

kyxcudwk2#

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

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 不在它里面,因为如果和为null,则要将其替换为零。)

相关问题