2015-12-17 170 views
0

我有以下查询,该查询对于在定义的时间段内返回每位客户的订单数和价值非常有用。MySQL查询:多个日期范围的客户订单值和订单计数

SELECT 
c.company, 
c.email, 
SUM(o.total_value) AS ttl_order_value, 
COUNT(p.order_id) AS ttl_order_count 
FROM merch_orders_ist AS o 
    INNER JOIN contacts_ern AS c 
    ON (o.contact_id = c.contactid) 
    INNER JOIN merch_payments_ist AS p 
    ON (o.id = p.order_id) 
WHERE DATE(p.date_of_payment) BETWEEN '2014-01-01' AND '2014-12-31' 
GROUP BY c.contactid 
ORDER BY ttl_order_value DESC 

我需要扩展该查询添加两个更多的列,其包括顺序总数和用于第二日期范围(例如2015和2014)每客户的订单的求和值。我期待的结果看起来像这样...

| company | email | ttl_order_value_2015 | ttl_order_count_2015 | ttl_order_value_2014 | ttl_order_count_2014 | 
--------------------------------------------------------------------------------------------------------------- 

在此先感谢您!

回答

1

我已经给出了需要修改但是应该根据您的要求工作的伪代码。

注意:如果语法不起作用,则将SUM(o.total_value)移除到o.total_value。你可以使用SUM通过编写一个简单的外部查询和分组

SELECT 
c.company, 
c.email, 
-- Using date put some condtions like >,< or extarct year and compare 
DECODE(p.date_of_payment, '2014',SUM(o.total_value),0) AS ttl_order_value_2014, 
Decode(p.date_of_payment,'2014' ,COUNT(p.order_id),0) AS ttl_order_count_2014, 

DECODE(p.date_of_payment, '2015',SUM(o.total_value),0) AS ttl_order_value_2015, 
Decode(p.date_of_payment,'2015' ,COUNT(p.order_id),0) AS ttl_order_count_2015, 

FROM merch_orders_ist AS o 
    INNER JOIN contacts_ern AS c 
    ON (o.contact_id = c.contactid) 
    INNER JOIN merch_payments_ist AS p 
    ON (o.id = p.order_id) 
WHERE DATE(p.date_of_payment) BETWEEN '2014-01-01' AND '2014-12-31' 
GROUP BY c.contactid 
ORDER BY ttl_order_value DESC 
+0

感谢您的回复和建议@avi。不幸的是,我对DECODE语句有些遗憾。我假设你说我应该在MySQL语句的那部分中使用子选择? – Spencer

+0

@Spencer我的肉是使用Decode或Case语句编写简单的查询语句,然后在该查询语句的上方写入SUM和Count函数。从(选择a,b,解码(日期,2014,C,0),解码(日期,2014,D,0))中选择A,B,sum(c),Count(D) table1 ...)组由A,B组成 – Avi