Запрос (выбрать 10 самых крупных по Сумме сделки по каждому Контрагенту)

1. ovadia 24.09.20 15:32 Сейчас в теме
Нужно выбрать 10 самых крупных по Сумме сделки по каждому Контрагенту. Не понимаю, как это реализовать? Подскажите, пожалуйста.

Вот запрос, который выбирает все сделки и их Суммы по каждому Контрагенту. В порядке убывания Суммы по каждому. Но суммы получаются все. А мне нужно только первые 10 (т.е. десять самых больших сумм). Явно что-то нужно делать по другому. Как из этого выбрать десять первых?

ВЫБРАТЬ
	Сделка.Контрагент,
	Сделка.СуммаРуб	
ИЗ
	Документ.Сделка КАК Сделка
УПОРЯДОЧИТЬ ПО
	Сделка.Контрагент,
	Сделка.СуммаРуб Убыв
ИТОГИ
	Сумма(Сделка.СуммаРуб)
ПО
	Сделка.Контрагент
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. nomad_irk 72 24.09.20 15:43 Сейчас в теме
(1)
Итоги вам точно не нужны.
Если Сделка в вашем понимании это сам документ, то:

1. Добавьте ссылку в результат запроса и поместить во временную таблицу
2. Соединить временную таблицу из п.1 саму с собой по равенству контрагента и по T1.Сумма >= (или <=) T2.Сумма, добавить поле Сумма(1) как количество сделок, группируя по Сделка, Контрагент, Сумма. Поместить во временную таблицу
3. Выбрать из временной таблицы из п.2 с отбором где КоличествоСделок <= 10.
8. ovadia 24.09.20 15:55 Сейчас в теме
(4) Сделка это сам документ. Не совсем понял. Мне надо не по количеству сделок, а по сумме сделки (документа). То есть выбрать 10 документов у каждого Контрагента с самыми большими суммами.
9. nomad_irk 72 24.09.20 15:56 Сейчас в теме
(8)Ну вам же в конечном счете нужно 10 сделок, а по сумме они отсортируются к этому времени соединением таблиц.
10. ovadia 24.09.20 16:01 Сейчас в теме
(9) Спасибо. Попробую. Ну что то не совсем уверен. Не понимаю, как должен выглядеть текст запроса в таком случае.
11. FatPanzer 24.09.20 16:03 Сейчас в теме
(9) Я бы сортировку по "Контрагент, Сумма" в п.1. для надежности вынес...

UPD. Упс. Она уже есть. Я не смотрел запрос, я только предлагаемый алгоритм почитал )))
12. ovadia 24.09.20 16:12 Сейчас в теме
(4)
1. Добавьте ссылку в результат запроса и поместить во временную таблицу


Первый пункт, это Вы имели ввиду так:
ВЫБРАТЬ
	Сделка.Контрагент,
	Сделка.СуммаРуб,
	Сделка.Ссылка
ПОМЕСТИТЬ ВТ	
ИЗ
	Документ.Сделка КАК Сделка
13. nomad_irk 72 24.09.20 16:20 Сейчас в теме
14. ovadia 24.09.20 16:30 Сейчас в теме
(4)
2. Соединить временную таблицу из п.1 саму с собой


Это как?
15. FatPanzer 24.09.20 16:34 Сейчас в теме
(14)
|	ВТ КАК ЛеваяТаблица
|		ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ПраваяТаблица
|		ПО ЛеваяТаблица.Контрагент = ПраваяТаблица.Контрагент"
17. ovadia 24.09.20 16:39 Сейчас в теме
(15)
ВТ КАК ЛеваяТаблица
Тут ошибка! Куда это кусок встраивается?
19. nomad_irk 72 24.09.20 16:40 Сейчас в теме
(17) должно быть

ИЗ ВТ КАК ЛеваяТаблица
20. FatPanzer 24.09.20 16:43 Сейчас в теме
(17) Тебе что, весь текст запроса привести?
"ВЫБРАТЬ
|	ЛеваяТаблица.Контрагент КАК Контрагент
|ИЗ
|	ВТ КАК ЛеваяТаблица
|		ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ПраваяТаблица
|		ПО ЛеваяТаблица.Контрагент = ПраваяТаблица.Контрагент"
16. nomad_irk 72 24.09.20 16:37 Сейчас в теме
(14) Так же как соединяете любые другие таблицы между собой.

Выбрать Т1.*, Т2.* ИЗ Таблица1 КАК Т1 ЛЕВОЕ СОЕДИНЕНИЕ Таблица2 КАК T2 ПО Т1.Поле1 = Т2.Поле1 И Т1.Поле2 = Т2.Поле2
18. nomad_irk 72 24.09.20 16:40 Сейчас в теме
(16) чую, тема - на гайд по созданию нумерованных списков средствами СУБД :)
так не далеко до гайда по window-функциям :)
21. FatPanzer 24.09.20 16:46 Сейчас в теме
(18) О, да. Старая задачка. Как в некой таблице узнать, на какой строке таблицы сумма в такой-то колонке превысит 1000 рублей...
2. PerlAmutor 129 24.09.20 15:35 Сейчас в теме
Так чем не устраивает?

ВЫБРАТЬ ПЕРВЫЕ 10
    Сделка.Контрагент,
    МАКСИМУМ(Сделка.СуммаРуб) КАК СуммаРуб
ИЗ
    Документ.Сделка КАК Сделка
СГРУППИРОВАТЬ ПО
    Сделка.Контрагент
УПОРЯДОЧИТЬ ПО
    СуммаРуб УБЫВ
Показать
5. nomad_irk 72 24.09.20 15:43 Сейчас в теме
(2)Тем, что в результате будет всего 10 записей по любым контрагентам.
6. ovadia 24.09.20 15:44 Сейчас в теме
(5) Верно. Это не устраивает. Нужно первые 10 по КАЖДОМУ контрагенту.
7. PerlAmutor 129 24.09.20 15:53 Сейчас в теме
(6) Не сразу понял задачу. Тогда как nomad_irk расписал. Логически вроде правильно.
3. fedel_lozovski 24.09.20 15:36 Сейчас в теме
Наверное ВЫБРАТЬ Первые 10
24. slasher777 26.09.20 20:50 Сейчас в теме
22. herfis 498 24.09.20 16:52 Сейчас в теме
ЕМНИП, как-то через коррелирующий подзапрос можно было.
Попробуй что-то типа такого
ВЫБРАТЬ
	*
ИЗ
	Документ.Сделка КАК Сделки
ГДЕ
	Сделки.Ссылка 
		В (ВЫБРАТЬ ПЕРВЫЕ 10 Ссылка
		 	ИЗ 
		 		Документ.Сделка КАК Сделки1
		 	ГДЕ
		 		Сделки1.Контрагент = Сделки.Контрагент
		 	УПОРЯДОЧИТЬ ПО
		 		Сделки1.Сумма УБЫВ)
Показать

ЗЫ. Если так не взлетит, тогда в условии соединения. Но точно делается.
23. PerlAmutor 129 24.09.20 16:58 Сейчас в теме
Можно так попробовать

ВЫБРАТЬ
	Т.Контрагент КАК Контрагент,
	Т.СуммаРуб КАК СуммаРуб
ИЗ
	Документ.Сделка КАК Т
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Сделка КАК Т2
		ПО Т.Контрагент = Т2.Контрагент
			И Т.СуммаРуб <= Т2.СуммаРуб
			И Т.МоментВремени >= Т2.МоментВремени

СГРУППИРОВАТЬ ПО
	Т.Контрагент,
	Т.СуммаРуб

ИМЕЮЩИЕ
	КОЛИЧЕСТВО(*) <= 10

УПОРЯДОЧИТЬ ПО
	Т.Контрагент,
	Т.СуммаРуб УБЫВ
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот