Помогите составить простой запрос
Показывать по
10
20
40
сообщений
- 1
- 2
11.11.2013
10:41
#13
Иногда возникает необходимость добавить в запрос колонку с номерами строк, например, когда нужно вывести номера строк в отчет, а используется построитель отчета. Так же нумерация строк полезна когда необходимо для определенных группировок вывести ограниченное количество строк данных. Что-то типа ПЕРВЫЕ 5 документов для каждого контрагента.
Данная статья навеяна обсуждением в: v8: Раздумья над запросом
Начнем с того, что в v8 используется ограниченный диалект SQL поэтому многие методики нумерации строк запроса, возможные в SQL, для нас не доступны. (если кому-то интересно как это делать в SQL -
Итак, есть код, выбирающий номенклатуру, отсортированный по наименованию:
исходный запрос
Требуется добавить сюда колонку с порядковыми номерами номенклатуры (в рамках данной сортировки).
запрос с номерами строк
Соединяем таблицу саму с собой довольно хитрым способом. По правой таблице подсчитываем количество номенклатуры с наименованием меньше текущего левого, используя группировку.
Аналогичную технику можно применить, если нужно задавать нумерацию строк с учетом группировки по какому-то полю.
запрос с номерами строк в рамках группировки
Это тот же самый запрос, в него просто добавлена группировка по полю "Родитель", нумерация для каждого родителя своя.
Быстродействие:
Если говорить о быстродействии, то запросы подобного рода естественно ресурсоемки (математически ложность порядка N^2). Для большинства повседневных задач их использование вполне приемлемо.
Кстати, второй запрос выполняется несколько быстрее первого, это связано с меньшим размером вспомогательных таблиц.
Пример реального использования:
Теперь немного о том, ради чего всё это делается, то-есть польза, которую можно извлечь из нумерации строк запроса.
Например, перед нами стоит задача получить для каждого контрагента пять последних документов поступления товаров и услуг:
запрос с номерами строк при наличии дублей интересующего поля(того,относительно которого строится счетчик)
Данная статья навеяна обсуждением в: v8: Раздумья над запросом
Начнем с того, что в v8 используется ограниченный диалект SQL поэтому многие методики нумерации строк запроса, возможные в SQL, для нас не доступны. (если кому-то интересно как это делать в SQL -
Итак, есть код, выбирающий номенклатуру, отсортированный по наименованию:
ВЫБРАТЬ Номенклатура.СсылкаИЗ Справочник.Номенклатура КАК НоменклатураУПОРЯДОЧИТЬ ПО Номенклатура.Наименование
исходный запрос
Требуется добавить сюда колонку с порядковыми номерами номенклатуры (в рамках данной сортировки).
ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, КОЛИЧЕСТВО(Номенклатура_1.Ссылка) КАК НомерИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура_1 ПО Номенклатура.Наименование >= Номенклатура_1.Наименование // Условие сортировки для нумерацииСГРУППИРОВАТЬ ПО Номенклатура.СсылкаУПОРЯДОЧИТЬ ПО Номенклатура.Наименование
запрос с номерами строк
Соединяем таблицу саму с собой довольно хитрым способом. По правой таблице подсчитываем количество номенклатуры с наименованием меньше текущего левого, используя группировку.
Аналогичную технику можно применить, если нужно задавать нумерацию строк с учетом группировки по какому-то полю.
ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, Номенклатура.Родитель КАК Родитель, КОЛИЧЕСТВО(Номенклатура_1.Ссылка) КАК НомерИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура_1 ПО Номенклатура.Наименование >= Номенклатура_1.Наименование И Номенклатура.Родитель = Номенклатура_1.РодительСГРУППИРОВАТЬ ПО Номенклатура.Родитель, Номенклатура.Ссылка
запрос с номерами строк в рамках группировки
Это тот же самый запрос, в него просто добавлена группировка по полю "Родитель", нумерация для каждого родителя своя.
Быстродействие:
Если говорить о быстродействии, то запросы подобного рода естественно ресурсоемки (математически ложность порядка N^2). Для большинства повседневных задач их использование вполне приемлемо.
Кстати, второй запрос выполняется несколько быстрее первого, это связано с меньшим размером вспомогательных таблиц.
Пример реального использования:
Теперь немного о том, ради чего всё это делается, то-есть польза, которую можно извлечь из нумерации строк запроса.
Например, перед нами стоит задача получить для каждого контрагента пять последних документов поступления товаров и услуг:
ВЫБРАТЬ ПоступлениеТоваровУслуг.Контрагент КАК Контрагент, ПоступлениеТоваровУслуг.Ссылка КАК Ссылка, КОЛИЧЕСТВО(ПоступлениеТоваровУслуг_1.Ссылка) КАК НомерИЗ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг_1 ПО ПоступлениеТоваровУслуг.Дата <= ПоступлениеТоваровУслуг_1.Дата И ПоступлениеТоваровУслуг.Контрагент = ПоступлениеТоваровУслуг_1.КонтрагентСГРУППИРОВАТЬ ПО ПоступлениеТоваровУслуг.Ссылка, ПоступлениеТоваровУслуг.КонтрагентИМЕЮЩИЕ КОЛИЧЕСТВО(ПоступлениеТоваровУслуг_1.Ссылка) <= 5УПОРЯДОЧИТЬ ПО Контрагент, Номер
запрос с номерами строк при наличии дублей интересующего поля(того,относительно которого строится счетчик)
ВЫБРАТЬ КОЛИЧЕСТВО(ФизическиеЛица_1.Наименование) КАК Номер, ФизическиеЛица.Ссылка КАК ФИОИЗ Справочник.ФизическиеЛица КАК ФизическиеЛица ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК ФизическиеЛица_1 ПО (ФизическиеЛица.Наименование + ФизическиеЛица.Код >= ФизическиеЛица_1.Наименование + ФизическиеЛица_1.Код)СГРУППИРОВАТЬ ПО ФизическиеЛица.СсылкаУПОРЯДОЧИТЬ ПО Номер
11.11.2013
10:55
#14
Вам надо было вывести список контрагентов и номера по порядку? В полученной ТЗ есть сами контрагенты и у ТЗ есть реквизит НомерСтроки, что то было нужно еще?Зачем получать геморой на больших объемах на ровном месте?
11.11.2013
10:56
#15
Какая разница, есть в ТЗ нумерация колонок или нет, если меня интересовал вопрос нумерации в запросе?
11.11.2013
11:40
#16
Иногда гораздо удобнее и эффективнее по производительности воспользоваться разными механизмами платформы 1С для получения результата. Например, если нужна нумерация для отчета, то лучше делать такое на СКД, а если для обработки данных, то как Prikum сказал, лучше получить номер из ТЗ или инкрементом переменной при обходе выборки.
- 1
- 2
Читают тему
(гостей: 1)