我有一个如下所示的订单表
order_id pre_pay_time pre_pay_amount pre_pay_type final_payment_time final_payment_amount final_payment_type
==============================================================================================================================
1 1234123413 10 1 1234123913 25 2
2 1234123414 25 1 0 100 0
3 1234123417 75 2 1234125416 155 1
4 0 0 0 1234126418 60 2
在这里,客户可以在订单上预付款,然后在最后支付余额,或者他们可以在最后支付全部金额。
pre_pay_time和final_payment_time列是UNIX时间戳。
我要做的是生成一个输出表,其中包含每个日历日的总和。为此,我加入了一个日历表。
目前,我能够成功输出最终付款金额的数据,以及每月每天的现金和信用卡付款金额(基于final_payment_type列)。
SELECT calendar.datefield AS DATE, IFNULL( SUM( orders.final_payment_amount ) , 0 ) AS total_sales,
IFNULL(sum(if(final_payment_type=1,orders.final_payment_amount,0)),0)AS total_cash,
IFNULL(sum(if(final_payment_type=2,orders.final_payment_amount,0)),0)AS total_card,
count(orders.id) AS order_counter
FROM orders
RIGHT JOIN calendar ON ( DATE( FROM_UNIXTIME( cast(orders.final_payment_time as signed) ) ) = calendar.datefield )
WHERE calendar.datefield >= '2016-4-1' AND calendar.datefield <= '2016-4-31'
GROUP BY DATE
我希望做的是扩展查询,以便我还可以根据pre_pay_time获取pre_pay_amount每天的总和值。这样我就可以将当天的总收入计算为final_payment_amount和pre_pay_amount的组合。
由于预付款可能在最后付款的不同日期进行,我相信我将不得不使用pre_pay_time列对同一日历表进行另一次加入。
这可以用一个查询吗?
答案 0 :(得分:1)
您可以执行以下操作....您将您的预付款和最终付款查询设为别名,然后按日期字段加入。
SELECT *
FROM ( SELECT calendar.datefield AS FinalDate,
IFNULL (SUM (orders.final_payment_amount), 0)
AS total_final_sales,
IFNULL (
SUM (
if (final_payment_type = 1,
orders.final_payment_amount,
0)),
0)
AS total_final_cash,
IFNULL (
SUM (
if (final_payment_type = 2,
orders.final_payment_amount,
0)),
0)
AS total_final_card,
COUNT (orders.id) AS order_final_counter
FROM orders
RIGHT JOIN calendar
ON (DATE (
FROM_UNIXTIME (
CAST(orders.final_payment_time AS signed))) =
calendar.datefield)
WHERE calendar.datefield >= '2016-4-1'
AND calendar.datefield <= '2016-4-31'
GROUP BY FinalDate) finalPay,
( SELECT calendar.datefield AS PreDate,
IFNULL (SUM (orders.pre_payment_amount), 0) AS total_pre_sales,
IFNULL (
SUM (
if (pre_payment_type = 1, orders.pre_payment_amount, 0)),
0)
AS total_pre_cash,
IFNULL (
SUM (
if (pre_payment_type = 2, orders.pre_payment_amount, 0)),
0)
AS total_pre_card,
COUNT (orders.id) AS order_pre_counter
FROM orders
RIGHT JOIN calendar
ON (DATE (
FROM_UNIXTIME (
CAST(orders.pre_payment_time AS signed))) =
calendar.datefield)
WHERE calendar.datefield >= '2016-4-1'
AND calendar.datefield <= '2016-4-31'
GROUP BY PreDate) prePay
WHERE prePay.PreDate = finalPay.FinalDate
答案 1 :(得分:0)
为了便于阅读(你的可读性的里程可能会有所不同!)我经常使用临时表来处理这样的事情。
也就是说,我会编写查询来计算pre_pay_amount总和,并将其与日期一起插入到临时表中。然后在日期将该临时表连接到此查询。
我发现使用临时表通常可以省去组合子句,以使总和正常工作。
答案 2 :(得分:0)
你可以用UNION来做。第二个查询类似于最终付款的查询,并使用pre_payment列。然后使用HAVING子句将它们与UNION和SUM连接起来。以下是如何执行此操作的一个很好的示例:Sum a union query