2015-07-04 3 views
4

У меня есть таблица с тремя столбцамиЛучший день недели

order; 
orderID | ordertotal | datetime 

1  | 100.00  | 2015-03-01 17:48:14 
2  | 150.00  | 2015-05-10 02:33:20 
3  | 5982.23 | 2015-06-11 17:11:30 
... 

я пытаюсь найти записи для SUM из ordertotals за дни недели.

Другими словами, я хочу увидеть лучший понедельник (для суммы заказов), лучший вторник и другие.

Наконец-то я получу результат, как показано ниже в течение семи дней недели.

DailyTotal | DayOfTheWeek | ActualDate 

    7500  | Monday  | 2015-03-01 
    8000  | Tuesday  | 2015-05-10 
    5000  | Wednesday | 2015-06-11 
... 

Я пробовал этот запрос, и он работал, за исключением ActualDate;

SELECT 
    MAX(o2.dailytotal) AS DailyTotal, 
    DATE_FORMAT(o2.datetime2, '%W') AS DayOfTheWeek, 
    o2.datetime2 AS ActualDate 
FROM 
    (
     SELECT 
      SUM(s1.ordertotal) AS dailytotal, 
      DATE(s1.datetime) AS datetime2 
     FROM 
      order AS o1 
     GROUP BY 
      DATE(o1.datetime) 
    ) AS o2 
GROUP BY DATE_FORMAT(o2.datetime2, '%W') 
ORDER BY 1 DESC 

Я жду ваших решений.

ответ

3

Это тот случай, когда substring_index()/group_concat() трюк, вероятно, лучший способ выразить запрос:

SELECT MAX(o2.dailytotal) AS DailyTotal, 
     DATE_FORMAT(o2.datetime2, '%W') AS DayOfTheWeek, 
     SUBSTRING_INDEX(GROUP_CONCAT(o2.datetime2 ORDER BY o2.dailytotal DESC), ',', 1) AS ActualDate 
FROM (SELECT DATE(s1.datetime) AS datetime2, 
      SUM(s1.ordertotal) AS dailytotal  
     FROM `order` o1 
     GROUP BY DATE(o1.datetime) 
    ) o2 
GROUP BY DATE_FORMAT(o2.datetime2, '%W') 
ORDER BY DailyTotal DESC; 

Есть проблемы с этим (такие как преобразование даты в строку и возможности выполнения промежуточный group_concat() Строка не достаточно большая - ее можно отрегулировать). Однако альтернативы приводят к гораздо более сложным запросам.

Ваша версия просто возвращает неопределенную дату.

Смежные вопросы