Здравствуйте. УНФ, есть запрос

```1c
    "ВЫБРАТЬ
    | Ссылка.Контрагент,
    | Ссылка.Магазин,
    | СУММА(КоличествоСпрос) КАК КолвоСпрос
    |ИЗ
    | Документ.СпросНаТовар.Товары
    |ГДЕ Ссылка.Дата МЕЖДУ ДОБАВИТЬКДАТЕ(&ДатаНачало, ГОД, -10) И &ДатаНачало
    | СГРУППИРОВАТЬ ПО Ссылка.Контрагент, СсылкаМагазин";.
```

Нужно для каждого магазина вывести 25% клиентов с крупным оборотом. В голову приходит только через цикл по клиентам формировать запросы для получения нужных данных (но в цикле формировать запросы сомнительная история). Статьи с рейтингом в скд смотрел, подходящей мне не нашел. Подскажите, пожалуйста, как можно рассчитать это в запросе или скд?
---
```1c
    ВЫБРАТЬ
    ТоварыНаСкладах.Магазин КАК Магазин,
    ТоварыНаСкладах.Контрагент КАК Контрагент,
    ТоварыНаСкладах.КоличествоСпрос КАК Количество
    ПОМЕСТИТЬ мТаб
    ИЗ
    Документ.СпросНаТовар.Товары КАК ТоварыНаСкладах
    ГДЕ Ссылка.Дата МЕЖДУ ДОБАВИТЬКДАТЕ(&ДатаНачало, ГОД, -10) И &ДатаНачало
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ ПЕРВЫЕ 999999
    мТаб.Магазин КАК Магазин,
    мТаб.Контрагент,
    мТаб.Количество КАК Количество,
    АВТОНОМЕРЗАПИСИ() КАК Поле1
    ПОМЕСТИТЬ мТаб2
    ИЗ
    мТаб КАК мТаб

    УПОРЯДОЧИТЬ ПО
    Магазин,
    Количество УБЫВ
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мТаб2.Магазин,
    МИНИМУМ(мТаб2.Поле1) КАК Поле1
    ПОМЕСТИТЬ мНачало
    ИЗ
    мТаб2 КАК мТаб2

    СГРУППИРОВАТЬ ПО
    мТаб2.Магазин
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мТаб2.Магазин,
    МАКСИМУМ(мТаб2.Поле1) КАК Поле1
    ПОМЕСТИТЬ мКонец
    ИЗ
    мТаб2 КАК мТаб2

    СГРУППИРОВАТЬ ПО
    мТаб2.Магазин
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мНачало.Магазин,
    мКонец.Поле1 - мНачало.Поле1 + 1 КАК Поле2,
    ВЫРАЗИТЬ((мКонец.Поле1 - мНачало.Поле1 + 1) * 0.25 + 0.49 КАК ЧИСЛО(15, 0)) КАК Сколько,
    мНачало.Поле1 КАК Начало
    ПОМЕСТИТЬ мКол
    ИЗ
    мНачало КАК мНачало
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ мКонец КАК мКонец
    ПО мНачало.Магазин = мКонец.Магазин
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мТаб2.Магазин,
    мТаб2.Контрагент,
    мТаб2.Количество
    ПОМЕСТИТЬ мИтого
    ИЗ
    мТаб2 КАК мТаб2
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ мКол КАК мКол
    ПО мТаб2.Магазин = мКол.Магазин
    И (мТаб2.Поле1 < мКол.Начало + мКол.Сколько)
```
---
Запрос получился грязный и делал на базе документа СчетПокупателя, а вместо сущности магазина использовал Ответственного в документе:
---
Как вариант. Сперва рассчитать общий максимальный итог. Поместить в ВТ.
Соединить эту ВТ с исходным запросом в соединении добавить условие 25% от итоговой.
В теории можно попробовать использовать конструкцию Имеющие , но не уверен, что взлетит (если только заранее известна граница).
---
1) в вт собираешь общую сумму
2) в запросе 2 вставляешь этт запрос из поста и делаешь

```1c
    Имеющие
    тут расчет что больше 25%
```
---
Так нужно вывести 25% клиентов с крупным оборотом а не клиентов с оборотом превышающий 25 % от суммы всего оборота. Т.е. если например за месяц в магазине отоварилось 1 тыс. то нужно вывести 250 человек с максимальным оборотом. Т.е. по сути это АBC анализ
---
так и че тебе мешает сделать по схеме выше? Все же просто. Как расчитать процент гугл отвечает по первой ссылке. Обработок по abc-xyz анализу в реальном времени на инфостарте как мусора, можно там подсмотреть.

Если ты думаешь что ты пришел сюда и тебе все выложили на тарелке, то ты ошибаешь. Здесь так не делают. Тебе кинут базовые вещи, направят куда надо и на этом ты продолжить свой путь самостоятельно.
---
Если ты думаешь что ты пришел сюда и тебе все выложили на тарелке, то ты ошибаешь. не, мне готовое решение не нужно, я просто не понимал, что именно мне искать. Спасибо еще раз!
---
Для начала протри глаза - я не ТС

Тут скорее нагрубят, чем предложат решение я уж не говорю про готовое

Лично твое решение я считаю не верным - нахрена нужна общая сумма оборота, в данной задаче. Ведь сказано что нужно выбрать 25 % с максимальным оборотом. А это значит что нужно взять обороты по каждом клиенту в порядке убывания в каждом магазине и из них выбрать первые 25 % . Вот теперь ответь - где тут применить Имеющие ?
---
с таким подходом мне плевать где. Решение простое - или ты принимаешь то что дают и на основе этой информации делаешь решение или делаешь сам с нуля. Другого не дано. А коль сам не можешь, тогда общайся нормально. Проблему у тебя (тса, да кого угодно), а не у меня, иначе задавал бы вопрос я а не ты(тс или кто угодно другой).

щас бы смотреть на ники отвечающего. Нуждаешься в помощи - создай свою тему, благо это бесплатно
---
спасибо!
---
С каким таким подходом ? Не можешь признать что ты не прав на счет своего предложннного решения ?

Еще раз вопрос по твоему решению - где в запросе нужно применить конструкцию Имеющие для получения 25 % клиентов с максимальным оборотом.
---
ты не в состоянии даже ответить на коммент чтоб он у меня в колокольчике появился. К чему ты вообще лезешь? Тс все понял, а вот ты упорный. Тс свою помощь получил, а ты справишься сам. Если ты не в состоянии применить конструкцию имеющие, то мне тебя даже не жаль. Гугл или ctrl+f1 в помощь
---
Тс все понял не совсем все... Написал запрос
```1c
    "ВЫБРАТЬ
    | СУММА(КоличествоСпрос) КАК КолвоСпросЗаПериод
    | ПОМЕСТИТЬ ВТСпросЗаПериод
    |ИЗ
    | Документ.СпросНаТовар.Товары
    |ГДЕ Ссылка.Дата МЕЖДУ ДОБАВИТЬКДАТЕ(&ДатаНачало, ГОД, -10) И &ДатаНачало;
    |
    |ВЫБРАТЬ
    | Ссылка.Контрагент,
    | Ссылка.Магазин,
    | СУММА(КоличествоСпрос) КАК КолвоСпрос
    |ИЗ
    | Документ.СпросНаТовар.Товары
    |ГДЕ Ссылка.Дата МЕЖДУ ДОБАВИТЬКДАТЕ(&ДатаНачало, ГОД, -10) И &ДатаНачало
    | СГРУППИРОВАТЬ ПО Ссылка.Контрагент, СсылкаМагазин ";
```
 но не совсем понимаю, как через ИМЕЮЩИЕ мне получить именно количество клиентов с большим спросом. Условно мне нужно получить по всем магазинам Количество спрос, сгруппировать по клиент и магазин, упорядочить по убыванию количество спрос, получить количество клиентов магазина, и из этого количества выделить 25% первых записей, из 20 клиентов получить 5 с большим количеством спроса. С помощью цикла уже решил эту задачу, выгрузив результат запроса и разбив его на несколько таблиц. Но как сделать это без циклов, а только запросом, я не могу разобаться. Посмотрел публикации по ABC анализу. Примеров самого запроса я не нашел. Если я правильно понял, то мне нужно получить количество крупный спрос именно по каждому магазину, условно поделив количество спрос магазина на количество клиентов, получив тем самым среднее значение спроса. И все, что больше среднего значения спроса, это и есть крупный спрос. Но тут опять все упирается именно в 25%... Или я вообще не в ту сторону думаю?
---
Господи, откуда Вы такие. Я тебе задал прямой вопрос и просто хочу что бы ты ответил на него. Если я окажусь не прав - я это признаю. Но чувствую ты так на него не ответишь а будешь и дальше Переходить на личности и грубить.
---
я не вижу смысла кормить тролля. Все просто. Не ищи скрытых смыслов. Все на поверхности
---
Все с тобой ясно, понятно. Ответа не будет опять какие-то отговорки.

А ведь мог бы просто ответить - я же говорю - если я не прав спокойно это признаю. Но нет, ты ищешь отмазки - то в ответе тебя не отметил , то троллем считаешь, но аргументировать свой ответ не можешь.
---
Так ты не на тот вопрос ответил и подорвался с этого? разве так сложно признать ошибку?
---
Ой всё =)
---
Бывает, никуда не денешься от такого
---
Как-то так:
```1c
    SEL ECT *
    FR OM (
    SEL ECT *, NTILE(4) OVER (ORDER BY some_column DESC) AS quartile
    FR OM your_table
    ) AS subquery
    WH ERE quartile = 1
```
Или так:
```1c
    SEL ECT TOP (25) PERCENT
    *
    FR OM your_table
    ORDER BY your_column DESC
```
Или так:
```1c
    SEL ECT *
    FR OM (
    SELECT *, PERCENT_RANK() OVER (ORDER BY some_column) AS pct_rank
    FR OM your_table
    ) AS subquery
    WHERE pct_rank <= 0.015; -- 1.5% = 0.015
```
Или так:..... ещё способов вагон и тележка
---
в 1с нет функций скуля. В скуле то понятно, вагон и тележка способов рассчитать все это дело. Или сейчас напишете, что в теме нет упоминания, что запрос должен быть в 1с?
---
Тююю... Какие проблемы? Напишите в 1С и в следующем релизе будут оконные функции в запросах в 1С.
Они же просто не в курсе, что в оконных функциях потребность есть. А так знали бы, то давно добавили бы. Делов то...
Вон бантики в интерфейсе вяжут без остановки. Уже и не знают чем себя занять. А тут Вы им такую идею...
Вот они обрадуются. Производительность платформы 1С же можно будет повысить. А то все почем зря 1С ругают про низкую производительность платформы...
---
в его тексте нет ничего чего нет в 1с. По факту запросы на Select в 1с это переведенный Sql. Более того можно воткруть этот текст в 1с и он будет работать даже на английском, потребуется только изменить имена таблиц и колонок по понятным причинам. Магия не иначе
---
Более того можно воткруть этот текст в 1с и он будет работать даже на английском, в 1с запросах нет таких функций. Если имеется ввиду запрос напрямую к скулю через ADODB.Connection, то увы, у меня база файловая
---
percent Не заметил. Топ точно есть. в остальое пуля в пулю как в 1с
---
NTILE тоже не заметили ?
---
угу. Детально не вглядывался, только беглым взглядом
---
```1c
    ВЫБРАТЬ
    ТоварыНаСкладах.Магазин КАК Магазин,
    ТоварыНаСкладах.Контрагент КАК Контрагент,
    ТоварыНаСкладах.КоличествоСпрос КАК Количество
    ПОМЕСТИТЬ мТаб
    ИЗ
    Документ.СпросНаТовар.Товары КАК ТоварыНаСкладах
    ГДЕ Ссылка.Дата МЕЖДУ ДОБАВИТЬКДАТЕ(&ДатаНачало, ГОД, -10) И &ДатаНачало
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ ПЕРВЫЕ 999999
    мТаб.Магазин КАК Магазин,
    мТаб.Контрагент,
    мТаб.Количество КАК Количество,
    АВТОНОМЕРЗАПИСИ() КАК Поле1
    ПОМЕСТИТЬ мТаб2
    ИЗ
    мТаб КАК мТаб

    УПОРЯДОЧИТЬ ПО
    Магазин,
    Количество УБЫВ
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мТаб2.Магазин,
    МИНИМУМ(мТаб2.Поле1) КАК Поле1
    ПОМЕСТИТЬ мНачало
    ИЗ
    мТаб2 КАК мТаб2

    СГРУППИРОВАТЬ ПО
    мТаб2.Магазин
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мТаб2.Магазин,
    МАКСИМУМ(мТаб2.Поле1) КАК Поле1
    ПОМЕСТИТЬ мКонец
    ИЗ
    мТаб2 КАК мТаб2

    СГРУППИРОВАТЬ ПО
    мТаб2.Магазин
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мНачало.Магазин,
    мКонец.Поле1 - мНачало.Поле1 + 1 КАК Поле2,
    ВЫРАЗИТЬ((мКонец.Поле1 - мНачало.Поле1 + 1) * 0.25 + 0.49 КАК ЧИСЛО(15, 0)) КАК Сколько,
    мНачало.Поле1 КАК Начало
    ПОМЕСТИТЬ мКол
    ИЗ
    мНачало КАК мНачало
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ мКонец КАК мКонец
    ПО мНачало.Магазин = мКонец.Магазин
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    мТаб2.Магазин,
    мТаб2.Контрагент,
    мТаб2.Количество
    ПОМЕСТИТЬ мИтого
    ИЗ
    мТаб2 КАК мТаб2
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ мКол КАК мКол
    ПО мТаб2.Магазин = мКол.Магазин
    И (мТаб2.Поле1 < мКол.Начало + мКол.Сколько)
```
---
жесть... Это гениально, я про АВТОНОМЕРЗАПИСИ даже не думал. Спасибо!
---
```1c
    SELECT TOP (25) PERCENT
```
 это синтаксис MS SQL.
---
NTILE на сейчас поддерживается всеми СУБД, которые поддерживает 1С (PostgreSQL, Oracle, MS SQL, IBM Db2)
Так же есть в MySQL и даже в SQLite.

А где её нет? Правильно в файловой версии 1С. Это же ещё одна пятая версия СУБД, которую разработала 1С и поддерживает. Но так поддерживает, что в итоге из-за того что эта версия СУБД многого не умеет, то и при работе с другими СУБД приходится ничего не использовать, кроме того что умеет файловая 1С. :-)

Файловая версия СУБД от 1С - по факту как она развивается, то является полным тормозом в развитии платформы 1С.
Парадокс. Не правда ли? :-)
Сами себя остановили ...
---
Запрос получился грязный и делал на базе документа СчетПокупателя, а вместо сущности магазина использовал Ответственного в документе:
---
Таблица НомерППОтвет вообще по факту не нужна
ВЫБРАТЬ ПЕРВЫЕ 1000000 - костыль, без которого не получится сделать сортировку
0.25 в запросе можно заменить на свой параметр
Короче задача выполнена, подгоняйте под себя.