2013-07-31 3 views
1

Моя Orders таблица выглядит следующим образом:заказов группы Oracle по дате и сумме общая

order_id  (number) 
order_total (number) 
created_date (timestamp) 
status  (varchar2) 

Моя цель состоит в том, чтобы получить набор строк, где каждая строка представляет все заказы на эту дату, так что я пытаюсь группировать заказы по дате и получать сумму order_total. Я также ограничиваю результаты только выбором заказов за последние 30 дней.

Чтобы уточнить, например, если в течение последних 30 дней в течение уникальных дней было 30 заказов, я бы получил 30 строк в результате. Другой пример: если 30 июля было 10 заказов и только 1 заказ, то я собираюсь получить 2 строки в результирующем наборе с order_total, суммированными для всех 10 заказов в первой строке, а вторая строка будет конечно, имеют order_total одного заказа 31-го.

Моя попытка до сих пор:

select 
    sum(order_total) total_amount, 
    to_char(created_date, 'DD/MM/YYYY') grouped_date 
from 
    orders 
where 
    status = 'Complete' and 
    created_date >= (sysdate-30) 
group by 
    to_char(created_date, 'DD'), to_char(created_date, 'MM'), to_char(created_date, 'YYYY') 
order by 
    created_date asc 

Это дает ошибку:

ORA-00936: missing expression

Я пытался использовать решение от this question, но я не думаю, что это вполне подходит для моего сценария (это то, откуда я пришел из моей группы по выражению).

+1

Почему у вас есть 'order_id' в списке' select'; что вы ожидаете показать там за одну строку, которая суммирует 10 заказов? Вам нужно либо удалить это, либо заменить его на агрегатную функцию. –

+0

Да, я согласен, что этого не должно быть, удалил это спасибо. Теперь ошибка изменилась на «ORA-00936: отсутствует выражение». – RandomCoder

ответ

3

Предполагая order_id там не должно быть, и что created_date имеет компонент времени (который, кажется, скорее всего, как это timestamp), вам нужно усечь дату, чтобы удалить время, когда делает агрегацию:

select 
    sum(order_total) as total_amount, 
    to_char(trunc(created_date), 'DD/MM/YYYY') as grouped_date 
from 
    orders 
where 
    status = 'Complete' and 
    created_date >= trunc(sysdate-30) 
group by 
    trunc(created_date) 
order by 
    trunc(created_date) asc 

Я также применил trunc к предложению where, иначе он проигнорировал бы любые заказы 30 дней назад между полуночью и любым временем, когда вы запустили запрос сегодня. И я использовал дату trunc'd прямо в order by, а не в псевдониме столбца, так что порядок прав, когда вы переходите через конец месяца, упорядочивая строковое значение DD/MM/YYYY, должно быть поставлено 01/07/2013 раньше 30/06/2013, например.

Quick SQL Fiddle.

+0

Это работает очень хорошо, спасибо! – RandomCoder

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