Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с запросом / 9 сообщений из 9, страница 1 из 1
02.07.2019, 10:33
    #39832603
TwoKs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Добрый день.
Я только начал изучать SQL
Прошу помощи в составлении запроса. Никак не могу сообразить)
Нужно вывести сумму самого раннего заказа за каждую дату.

Данные таблицы:
Наименование поля Тип данных поля Назначение
ONUM NUMBER(4) Уникальный номер заказа
AMT number(7,2) Сумма заказа
ODATE DATE Дата выполнения заказа
CNUM NUMBER(4) Номер покупателя, сделавшего заказ
SNUM NUMBER(4) Номер продавца, оформившего заказ
...
Рейтинг: 0 / 0
02.07.2019, 10:41
    #39832604
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with  ORD (ONUM, AMT, ODATE, CNUM, SNUM)
as ( 
     select 3001, 18.69,   to_date('03.01.2010','dd.mm.yyyy'), 2008, 1007 from dual union all
     select 3003, 767.19,  to_date('03.01.2010','dd.mm.yyyy'), 2001, 1001 from dual union all
     select 3002, 1900.10, to_date('03.01.2010','dd.mm.yyyy'), 2007, 1004 from dual union all
     select 3005, 5160.45, to_date('03.01.2010','dd.mm.yyyy'), 2003, 1002 from dual union all
     select 3006, 1098.16, to_date('03.01.2010','dd.mm.yyyy'), 2008, 1007 from dual union all
     select 3009, 1713.23, to_date('04.01.2010','dd.mm.yyyy'), 2002, 1003 from dual union all
     select 3007, 75.75,   to_date('04.01.2010','dd.mm.yyyy'), 2004, 1002 from dual union all
     select 3008, 4723.00, to_date('05.01.2010','dd.mm.yyyy'), 2006, 1001 from dual union all
     select 3010, 1309.95, to_date('06.01.2010','dd.mm.yyyy'), 2004, 1002 from dual union all
     select 3011, 9891.88, to_date('06.01.2010','dd.mm.yyyy'), 2006, 1001 from dual
    )
    
select ODATE, min(AMT) over(partition by ODATE)
from ORD
...
Рейтинг: 0 / 0
02.07.2019, 11:00
    #39832620
TwoKs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Запрос ниже выдает самые ранние заказы на каждую дату:

SELECT odate, MIN(onum) FROM ord
GROUP BY odate
ORDER BY odate;

Не соображу как к этому запросу присоседить сумму заказа (AMT) Или наоборот..
...
Рейтинг: 0 / 0
02.07.2019, 11:05
    #39832623
Anatoly B
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
TwoKs,
Код: plsql
1.
2.
3.
select * 
from ORD 
WHERE (ONUM) IN (SELECT ONUM FROM (SELECT MIN(ONUM) AS ONUM, ODATE FROM ORD GROUP BY ODATE))
...
Рейтинг: 0 / 0
02.07.2019, 11:08
    #39832630
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
MIN(onum) - это не самый ранний, а заказ с минимальным номером. Есть разница.
Но вы правы в том, что можно написать запрос с подзапросом.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
select ORD.ODATE, ORD_MIN.ONUM
  from ORD, (
                 SELECT odate, MIN(onum) ONUM FROM ord
                  GROUP BY odate
                  ORDER BY odate
             ) ORD_MIN
 where ORD.ODATE = ORD_MIN.ODATE
...
Рейтинг: 0 / 0
02.07.2019, 11:12
    #39832633
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
TwoKsНужно вывести сумму самого раннего заказа за каждую дату.Косноязычность.
dmdmdm
Код: plsql
1.
 min(AMT) over(partition by ODATE)

При любой интерпретации косноязычности - неправильно.
Anatoly B
Код: plsql
1.
WHERE (ONUM) IN (SELECT ONUM FROM (SELECT MIN(ONUM) AS ONUM, ODATE FROM ORD GROUP BY ODATE))

Быдлокод прошлого века.

Всем RTFM first/last
...
Рейтинг: 0 / 0
02.07.2019, 11:54
    #39832672
TwoKs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
dmdmdm,
в данном случае ранний заказ тот , у которого номер меньше .
Ваш запрос не дает нужный результат , к сожалению.

Результат д.б. таким:
ONUM AMT ODATE
3001 18.69 01/03/2010
3007 75.75 01/04/2010
3008 4723 01/05/2010
3010 1309.95 01/06/2010
...
Рейтинг: 0 / 0
02.07.2019, 12:01
    #39832675
TwoKs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Anatoly B,

Спасибо. Запрос отрабатывает.
А есть могут быть еще варианты на этот запрос?
...
Рейтинг: 0 / 0
02.07.2019, 12:25
    #39832694
ps
ps
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
если без аналитики и показывать надо только первые (по номеру ONUM) AMT, то аггрегация с <keep> поможет.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with  ORD (ONUM, AMT, ODATE, CNUM, SNUM)
as ( 
     select 3001, 18.69,   to_date('03.01.2010','dd.mm.yyyy'), 2008, 1007 from dual union all
     select 3003, 767.19,  to_date('03.01.2010','dd.mm.yyyy'), 2001, 1001 from dual union all
     select 3002, 1900.10, to_date('03.01.2010','dd.mm.yyyy'), 2007, 1004 from dual union all
     select 3005, 5160.45, to_date('03.01.2010','dd.mm.yyyy'), 2003, 1002 from dual union all
     select 3006, 1098.16, to_date('03.01.2010','dd.mm.yyyy'), 2008, 1007 from dual union all
     select 3009, 1713.23, to_date('04.01.2010','dd.mm.yyyy'), 2002, 1003 from dual union all
     select 3007, 75.75,   to_date('04.01.2010','dd.mm.yyyy'), 2004, 1002 from dual union all
     select 3008, 4723.00, to_date('05.01.2010','dd.mm.yyyy'), 2006, 1001 from dual union all
     select 3010, 1309.95, to_date('06.01.2010','dd.mm.yyyy'), 2004, 1002 from dual union all
     select 3011, 9891.88, to_date('06.01.2010','dd.mm.yyyy'), 2006, 1001 from dual
    )    
select ODATE, min(AMT) keep (dense_rank first order by ONUM) first_AMT
from ORD
group by ODATE
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с запросом / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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