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

Данные таблицы:
Наименование поля Тип данных поля Назначение
ONUM NUMBER(4) Уникальный номер заказа
AMT number(7,2) Сумма заказа
ODATE DATE Дата выполнения заказа
CNUM NUMBER(4) Номер покупателя, сделавшего заказ
SNUM NUMBER(4) Номер продавца, оформившего заказ
...
Рейтинг: 0 / 0
Помогите с запросом
    #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
Помогите с запросом
    #39832620
TwoKs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запрос ниже выдает самые ранние заказы на каждую дату:

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

Не соображу как к этому запросу присоседить сумму заказа (AMT) Или наоборот..
...
Рейтинг: 0 / 0
Помогите с запросом
    #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
Помогите с запросом
    #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
Помогите с запросом
    #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
Помогите с запросом
    #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
Помогите с запросом
    #39832675
TwoKs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly B,

Спасибо. Запрос отрабатывает.
А есть могут быть еще варианты на этот запрос?
...
Рейтинг: 0 / 0
Помогите с запросом
    #39832694
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
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с запросом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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