2015-03-22 6 views
2

Я пытаюсь выбрать данные о продажах за последние 10 дней и включать дату с 0, где не было продаж.Использование Oracle для получения последних десяти дней продаж, даже если у дня нет ни одного

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

Вот основной рабочий запрос:

SELECT 
    current_date - (LEVEL - 1) 
    ,(LEVEL - 1) as result 
FROM Dual CONNECT BY Level <= 10 
order by result desc 

И результаты:

Current_date-(LEVEL-1) RESULT 
13-MAR-15 9 
14-MAR-15 8 
15-MAR-15 7 
16-MAR-15 6 
17-MAR-15 5 
18-MAR-15 4 
19-MAR-15 3 
20-MAR-15 2 
21-MAR-15 1 
22-MAR-15 0 

Так я думал, что это будет работать замечательно, Теперь, когда у меня были даты, что я хотел, я мог попробуйте добавить подзапрос для получения продаж (я думал о соединении, но не понял, как присоединиться к уровню в запросе):

SELECT 
    current_date - (LEVEL - 1) 
    ,(select count(1) from sales where for_date=(current_date - (LEVEL - 1))) as sale_volume 
    ,(LEVEL - 1) as result 
FROM Dual CONNECT BY Level <= 10 
order by result desc 

Тем не менее, всегда Retuns 0, даже в те дни, которые я знаю, есть продажи:

Current_date-(LEVEL-1) SALE_VOLUME RESULT 
13-MAR-15 0 9 
14-MAR-15 0 8 
15-MAR-15 0 7 
16-MAR-15 0 6 
17-MAR-15 0 5 
18-MAR-15 0 4 
19-MAR-15 0 3 
20-MAR-15 0 2 
21-MAR-15 0 1 
22-MAR-15 0 0 

ответ

1
SELECT 
    count(sales.for_Date) 
FROM 
    (SELECT 
     Trunc(current_date) - (LEVEL - 1) as d 
    FROM 
     Dual CONNECT BY Level <= 10) as DateRangeTbl 
LEFT JOIN 
    sales 
ON 
    Sales.for_Date = DateRangeTbl.d 
GROUP BY 
    DateRangeTbl.d 
+0

По какой-то причине мне не понравилось, что я назвал подзапрос «DateRangeTbl», но был доволен удалением, так как он все равно возвращает все 0s, и это заставляет меня думать, что что-то не так с совпадением дат. – nycynik

+0

В столбце for_date также есть Times? – Aheho

+0

Это столбец «дата» в оракуле, и если я запрашиваю его, он показывает «2015-03-15 00:00:00» – nycynik

0

Одно дополнение к решению заданной Aheho - Вам также необходимо вырезать компонент времени от продаж. for_Date, иначе условие равенства в предложении ON не будет работать. Это может быть достигнуто с помощью trunc() или преобразования обеих дат в строку с использованием to_char (дата-дата, формат даты) в предложении ON. Я получил его для работы с моей базой данных с помощью обоих методов. Формат даты может быть, например, «DD-MON-YYYY».