【问题标题】:LEFT JOIN - Return empty results with left join for sum of payment_methodLEFT JOIN - 使用左连接返回空结果作为 payment_method 的总和
【发布时间】:2018-07-01 20:41:23
【问题描述】:

这是我关于 stackoverflow 的第一个问题,所以我尽量不搞砸。我在这个查询上摸索了几个小时,但没有任何进展。

我使用一个视图,其中包含多个预订。所有这些预订都有一个 payment_method 例如贝宝或信用卡。

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

【问题讨论】:

  • 您的结果就是 LEFT JOIN 会做的事情。您应该 SUM TotalQuantity 和 Group By payment_method。您看过 Group By 子句吗?类似的东西:
  • 您的查询中还有一个错字:FROM PaymentMethods LEFT JOIN PaymentMethods 当然必须是FROM PaymentMethods LEFT JOIN SlotBookingsFullView

标签: mysql sql join left-join


【解决方案1】:

当你外连接记录时,它们的值为空:

PaymentMethods.方法 | B.payment_method | B.booking_date | B.数量 ------------------------------------+--------+------ -------------+------------ 信用卡 |信用卡 | 2018-07-01 | 2 信用卡 |信用卡 | 2018-07-05 | 1 信用卡 |信用卡 | 2018-04-21 | 4 溢价 |空 |空 |无效的 ...

所以

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;

(如您所见,COALESCEIFNULL 属于 SUM 之外而不在其中,因为如果 sum 为空,则您想将其替换为零。)

【讨论】:

  • 您的解决方案非常完美!也感谢您的解释 Thorsten!
【解决方案2】:

您的结果就是 LEFT JOIN 会做的事情。您应该 SUM TotalQuantity 和 Group By payment_method。您看过 Group By 子句吗?类似的东西:

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

【讨论】:

  • 感谢您的回复。你说的对。需要 GROUP BY,我已经有了它,但是在复制它时丢失了它。见编辑。我在您的回复中不明白 sum(totalqantity) 应该如何工作。 totalquantity 不是一列,而是一个“变量”。
  • 我在手机上阅读速度很快。认为我可以通过建议 Group By 来提供帮助。很高兴你成功了。
  • 顺便说一句,您可以按“变量”进行分组,而无需使用 CTE 创建另一个表。检查出来。
猜你喜欢
  • 2019-03-25
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 2014-11-15
  • 2013-11-28
  • 1970-01-01
相关资源
最近更新 更多