pavel_tr писал(а) 29. Сентября 2014 :: 07:41:С этим всё просто. При использовании группировки по любому реквизиту в выборке или должна существовать группировка, или он должен быть включён в
агрегатную функцию.
Возьмём пример из той статьи, на которую я приводил ссылку:
ТекстЗапроса = "
|SELECT
| Выборка.Склад as [Склад $Справочник.Склады]
| СпрС.Descr as Склад_Наименование,
| Выборка.Товар as [Товар $Справочник.Номенклатура],
| СпрН.Descr as Товар_Наименование
| Выборка.ИтогПоСкладам as ИтогПоСкладам,
| Выборка.ИтогПоТоварам as ИтогПоТоварам,
| Выборка.Количество as Количество
|FROM
|(
|SELECT
| Рег.Склад as Склад,
| Рег.Товар as Товар,
| GROUPING(Рег.Склад) as ИтогПоСкладам,
| GROUPING(Рег.Товар) as ИтогПоТоварам,
| SUM(Рег.КоличествоОстаток) as Количество
|FROM
| $РегистрОстатки.ОстаткиТоваров(:ВыбДата~,,
| Склад = :ВыбСклад AND Товар = @Товар,
| (Склад, Товар), (Количество)) as Рег
|GROUP BY
| Рег.Склад, Рег.Товар WITH ROLLUP
|) as Выборка
|LEFT JOIN
| $Справочник.Склады as СпрС ON СпрС.ID = Выборка.Склад
|LEFT JOIN
| $Справочник.Номенклатура as СпрН ON СпрН.ID = Выборка.Товар
|ORDER BY
| СпрС.Descr, СпрН.Descr, Выборка.ИтогПоСкладам DESC, Выборка.ИтогПоТоварам DESC
|";
Здесь группировка в подзапросе, но её можно вынести и наверх и тогда всё станет ясно:
ТекстЗапроса = "
|SELECT
| Рег.Склад as [Склад $Справочник.Склады]
| max(СпрС.Descr) as Склад_Наименование,
| Рег.Товар as [Товар $Справочник.Номенклатура],
| max(СпрН.Descr) as Товар_Наименование
| GROUPING(Рег.Склад) as ИтогПоСкладам,
| GROUPING(Рег.Товар) as ИтогПоТоварам,
| SUM(Рег.КоличествоОстаток) as Количество
|FROM
| $РегистрОстатки.ОстаткиТоваров(:ВыбДата~,,
| Склад = :ВыбСклад AND Товар = @Товар,
| (Склад, Товар), (Количество)) as Рег
|LEFT JOIN
| $Справочник.Склады as СпрС ON СпрС.ID = Рег.Склад
|LEFT JOIN
| $Справочник.Номенклатура as СпрН ON СпрН.ID = Рег.Товар
|GROUP BY
| Рег.Склад, Рег.Товар WITH ROLLUP
|ORDER BY
| max(СпрС.Descr), max(СпрН.Descr), GROUPING(Рег.Склад) DESC, GROUPING(Рег.Товар) DESC
|";
Сделал что-то аналогичное:
ТекстЗапроса = "
|Select
| Рег.Магазин [Склад $Справочник.Подразделения],
| Рег.Товар [Товар $Справочник.Номенклатура],
| $Номен.ВидИзделия [Вид $Перечисления.ВидИзделия],
| $Номен.Тип [Тип $Справочник.Тип],
| $Номен.ТипПФ [ТипПФ $Справочник.ТипПФ],
| Рег.Партия [Партия $Справочник.Партии],
| max($ПартЗ.Descr) as ПартНаим,
| GROUPING(Рег.Партия) as ИтогПоПартии,
| $ПартЗ.Распродажа [Акция $Перечисления.Булево],
| $ПартЗ.ВидУчета [Вуду $Перечисления.ВидУчета],
| $ПартЗ.Поставщик [Клиент $Справочник.Контрагенти],
| $ПартЗ.Фирма [Фирма $Справочник.Фирмы],
| $ПартЗ.ВладелецТовара [ВладелецТовара $Справочник.Контрагенти],
| $ПартЗ.Цвет [Цвет $Перечисления.Цвет],
| $ПартЗ.Размер as Размер,
| $ПартЗ.БрилКол as БрилКол,
| $ПартЗ.ЦвДрКол as ЦвДрКол,
| $ПартЗ.ЖемчугКол as ЖемчугКол,
| Рег.КоличествоОстаток as ШтОст,
| Рег.МассаОстаток as МОст,
| Рег.МассаБКОстаток as МБКОст,
| Рег.СуммаПродажиОстаток as КПОст,
| Рег.СуммаОстаток as КОст
|FROM
| $РегистрОстатки.Взаиморасщеты(,,/*УсловияСклад*/ /*УсловиеВыбКод*/,(Магазин,Товар,Партия)
| ,(Количество,Масса,МассаБК,СуммаПродажи,Сумма)) as Рег
| left join $Справочник.Номенклатура as Номен (nolock) on Номен.id = Рег.Товар
| left join $Справочник.Партии as ПартЗ (nolock) on ПартЗ.id = Рег.Партия
|Where
| Рег.КоличествоОстаток > 0
| AND $Номен.Тип = :ТипЗ
| /*УсловияАкц*/
| /*УсловиеТипПФ*/
| /*УсловиеФирма*/
| /*УсловиеПоставщик*/
| /*УсловиеВид*/
| /*УсловиеКлиент*/
| /*УсловиеУчет*/
| /*УсловиеРазмер*/
| /*УсловиеБрилКол*/
| /*УсловиеЦвДрЦ*/
| /*УсловиеБриллДраг*/
| /*УсловиеЖемчуг*/
| /*УсловиеЦиркон*/
| /*УсловиеЦвет*/
|GROUP BY
| Рег.Партия WITH ROLLUP
|ORDER BY
| max($ПартЗ.Descr),GROUPING(Рег.Партия) DESC
|";
но выкидывает ошибку:
ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
{D:\#TEST\SQL\РЕАЛИЗАЦИЯДОХОД07.ERT(2809)}: Meta name parser error: поле таблицы не найдено "$ПартЗ.Descr"
пока не могу проверить проходит оно группировку или нет (