Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вывести среднее значение / 11 сообщений из 11, страница 1 из 1
02.12.2017, 21:57
    #39563122
Odig
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести среднее значение
Вывести среднее значение стоимости в разрезе 3х последних месяцев.
Есть 2 таблицы booking_date (представлена в денормализованной форме) и booking, они связаны через date_id.

booking_date
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DATE_ID	DAY	MONTH	YEAR	HOUR	MINUTE	SECOND
1	23	5	17	12	0	0
2	14	9	17	21	0	0
3	14	9	17	10	30	0
4	1	7	17	15	30	0
5	5	8	17	7	0	0
6	11	10	17	16	30	0
7	12	10	17	12	0	0
8	14	10	17	11	0	0
9	30	8	17	11	0	0
10	15	11	17	7	0	0
11	20	11	17	12	0	0
12	26	5	17	14	0	0
13	27	5	17	10	0	0
14	1	12	17	18	0	0
15	2	12	17	11	0	0
16	30	9	17	14	0	0
17	2	10	17	9	0	0


booking
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
BO_ID	DATE_ID	COST
1	3	600
2	4	2850
3	6	1000
4	6	1000
5	5	2000
6	5	2000
7	5	2000
8	1	850
9	9	600
10	2	850



Сам запрос:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT booking.date_id, sum(cost) as sum_cost, 
avg(sum(cost)) over (ORDER BY booking.date_id 
RANGE BETWEEN INTERVAL '1' DAY PRECEDING AND 
INTERVAL '1' DAY FOLLOWING) as centr_avg 
from booking, booking_date 
WHERE booking.date_id=booking_date.date_id 
AND (select booking_date.date_id in between TO_DATE('20171001', 'yyyymmdd') 
AND TO_DATE('20171011', 'yyyymmdd' from booking_date)) 
GROUP BY booking.date_id;



Подскажите, как правильно преобразовать строковое значение в тип date?
...
Рейтинг: 0 / 0
02.12.2017, 22:27
    #39563132
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести среднее значение
OdigПодскажите, как правильно преобразовать строковое значение в тип date?

select TO_DATE('20171011', 'yyyymmdd') from dual
...
Рейтинг: 0 / 0
02.12.2017, 22:29
    #39563134
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести среднее значение
Odig
Код: plsql
1.
2.
(select booking_date.date_id in between TO_DATE('20171001', 'yyyymmdd') 
AND TO_DATE('20171011', 'yyyymmdd' from booking_date))

Что это за бред?
...
Рейтинг: 0 / 0
02.12.2017, 23:54
    #39563165
Odig
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести среднее значение
ElicOdig
Код: plsql
1.
2.
(select booking_date.date_id in between TO_DATE('20171001', 'yyyymmdd') 
AND TO_DATE('20171011', 'yyyymmdd' from booking_date))

Что это за бред?

Да, тут бред написан, как его исправить?
...
Рейтинг: 0 / 0
03.12.2017, 04:27
    #39563204
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести среднее значение
А в чем проблема то?
Приводи к виду yyyymm и группируйь по этой строке.

OdigВывести среднее значение стоимости
А почему avg(sum(cost)) а не avg(cost)

Odig в разрезе 3х последних месяцев.
"тор 3 " в Oracle работает?
...
Рейтинг: 0 / 0
03.12.2017, 11:11
    #39563225
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести среднее значение
Odig,

Судя по воодным данным, Вам надо дату собрать:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT booking.date_id, 
sum(cost) as sum_cost, 
avg(sum(cost)) over (ORDER BY booking.date_id RANGE BETWEEN INTERVAL '1' DAY PRECEDING AND INTERVAL '1' DAY FOLLOWING) as centr_avg 
from booking, booking_date bd
WHERE booking.date_id=bd.date_id 

and to_date(bd.YEAR||Lpad(bd.MONTH,2,'0')||Lpad(bd.DAY,2,'0'),'yymmdd') 
       between TO_DATE('20171001', 'yyyymmdd') AND TO_DATE('20171011', 'yyyymmdd')

GROUP BY booking.date_id;



В вашем случае можно работать с датами как со стрингами, представив год 2 знаками:
Код: plsql
1.
and bd.YEAR||Lpad(bd.MONTH,2,'0')||Lpad(bd.DAY,2,'0') between '171001' AND '171011'



То что выводит селект - не смотрел, так как не понял что надо вывести
...
Рейтинг: 0 / 0
03.12.2017, 14:29
    #39563267
to_date to_char
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести среднее значение
Код: plsql
1.
2.
3.
4.
5.
6.
with bdwd as
 (select b.date_id,
         to_date(to_char(b.year, 'fm00') || to_char(b.month, 'fm00') || to_char(b.day, 'fm00') ||
                 to_char(b.hour, 'fm00') || to_char(b.minute, 'fm00') || to_char(b.second, 'fm00'), 'yymmddhh24miss') dt
    from booking_date b)
select ...
...
Рейтинг: 0 / 0
03.12.2017, 19:40
    #39563345
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести среднее значение
Odig,

В Вашем случае вообще можно с number работать

Код: plsql
1.
2.
3.
and bd.YEAR*10000+
    bd.MONTH *100+
    bd.DAY  between 171001 AND 171011
...
Рейтинг: 0 / 0
03.12.2017, 20:28
    #39563358
Odig
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести среднее значение
MaximaXXLOdig,

В Вашем случае вообще можно с number работать

Код: plsql
1.
2.
3.
and bd.YEAR*10000+
    bd.MONTH *100+
    bd.DAY  between 171001 AND 171011


Мне нужен вывод даты именно в типе date.
...
Рейтинг: 0 / 0
03.12.2017, 22:53
    #39563374
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести среднее значение
OdigМне нужен вывод даты именно в типе date.

Вывод, это в кляузе селект, как собрать, я и "to_date to_char" описали выше
А в where можно и числами баловаться
...
Рейтинг: 0 / 0
04.12.2017, 02:46
    #39563401
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести среднее значение
OdigМне нужен вывод даты именно в типе date.
Тогда что-то у тебя неправильно в описании задачи.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вывести среднее значение / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]