2014-11-28 4 views
1

Я пытаюсь выполнить один запрос, чтобы дать мне заказ сумме более двух диапазонов дат для каждого типа услугиMySQL запроса для получения заказов в течение двух диапазонов дат

orderDate serviceType revenue 
2014-01-01 1   3.00 
2014-01-02 2   4.00 
2014-01-01 1   5.00 
2014-01-03 3   3.00 
2014-01-02 1   4.00 
2014-01-04 2   5.00 
2014-01-20 1   4.00 
2014-01-21 2   5.00 
2014-01-23 1   6.00 
2014-01-24 3   4.00 
2014-01-20 1   5.00 
2014-01-21 2   6.00 

запроса, чтобы получить общее количество заказов и доход для одного диапазона дат прост:

select serviceType, count(*) as totalOrders, sum(revenue) as totalRevenue 
from orders 
where orderDate >= '2014-01-01' 
    and orderDate <= '2014-01-05' 
group by serviceType 

Но я хотел бы сделать два диапазона дат в одном запросе и получить один результат, как это (где totalOrders_1 и totalRevenue_1 представляют первый диапазон дат и totalOrders_2 и totalRevenue_2 вторые)

serviceType totalOrders_1 totalRevenue_1  totalOrders_2 totalRevenue_2 
1   3    12.00    3    15.00 
2   2    9.00    2    11.00 
3   1    3.00    1    4.00 
+0

google this: сводная таблица – DwB

ответ

2

Просто используйте объединение на двух вложенных запросах, как это (непроверенные):

select o1.serviceType, totalOrders_1, totalRevenue_1, totalOrders_2, totalRevenue_2 
from 
(select serviceType, count(*) as totalOrders_1, sum(revenue) as totalRevenue_1 
from orders 
where orderDate >= '2014-01-01' 
    and orderDate <= '2014-01-05' 
group by serviceType) o1 
inner join 
(select serviceType, count(*) as totalOrders_2, sum(revenue) as totalRevenue_2 
from orders 
where orderDate >= '2014-02-01' 
    and orderDate <= '2014-02-05' 
group by serviceType) o2 using (serviceType) 

Не очень элегантно, но поворотное решение будет на самом деле имеют аналогичные затраты на обработку.

+0

Должно работать, но для наружного 'SELECT' требуется' FROM'. http://sqlfiddle.com/#!2/0ca5d6/7 (и второй диапазон дат, который фактически возвращает строки) –

+0

спасибо! вы добавили его для меня? :) – koriander

+0

Да, я добавила FROM –

0

Для того, чтобы включить строки, которые имеют нулевой отсчет для данного ServiceType для любой из периодов, вы могли бы сделать что-то вроде этого:

SELECT o.serviceType 
    , SUM(IF(o.orderDate >= '2014-01-01' AND o.orderDate <= '2014-01-05' 
      ,1,0) 
     ) AS totalOrders_1 
    , SUM(IF(o.orderDate >= '2014-01-01' AND o.orderDate <= '2014-01-05' 
      ,o.revenue,0) 
     ) AS totalRevenue_1 
    , SUM(IF(o.orderDate >= '2014-02-01' AND o.orderDate <= '2014-02-05' 
      ,1,0) 
     ) AS totalOrders_2 
    , SUM(IF(o.orderDate >= '2014-02-01' AND o.orderDate <= '2014-02-05' 
      ,o.revenue,0) 
     ) AS totalRevenue_2 
    FROM orders o 
WHERE (o.orderDate >= '2014-01-01' AND o.orderDate <= '2014-01-05') 
    OR (o.orderDate <= '2014-02-01' AND o.orderDate <= '2014-02-05') 
GROUP BY o.serviceType 

Такой подход позволяет возвращение строк, как это:

serviceType totalOrders_1 totalRevenue_1 totalOrders_2 totalRevenue_2 
4   1    111.00   0    0.00 
5   0    0.00   2    444.44 
Смежные вопросы