这是我在stackoverflow上的第一个问题,所以我尽量不搞砸。我在这个问题上纠结了几个小时,没有任何进展。
我用的是一个有好几个预订的景观。所有这些预订都有付款方式,如贝宝或信用卡。
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
最佳答案
当外部联接记录时,它们的值为空:
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 ...
So with
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
之外,而不是它内部,因为如果总和为空,则需要将其替换为零。)