MySQL多个连接到日历表的付款数据

时间:2016-04-22 19:32:56

标签: mysql sql

我有一个如下所示的订单表

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列对同一日历表进行另一次加入。

这可以用一个查询吗?

3 个答案:

答案 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