Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как перестроить запрос с использованием оконных функций?  [new]
Борис Гаркун
Member

Откуда: Лермонтов
Сообщений: 250
Здравствуйте!

Упрощенно есть запрос вида:
SELECT
  CASE WHEN GROUPING(t.C_TP) = 0 THEN t.C_TP ELSE 'Итого' END as ТП
  , CASE WHEN GROUPING(mli.mli_number) = 0 THEN mli.mli_number ELSE 'Итого' END as [Наименование маршрутного листа]
  , SUM(t.tu_cnt) as [Кол-во точек на ТП]
FROM #tp t
JOIN #mli mli ON mli.tp_link = t.LINK
GROUP BY ROLLUP(t.C_TP, mli.mli_number )

, который среди прочих возвращает строки:
Итого Итого 8
ТП1 МЛ1 3
ТП1 МЛ2 3
ТП2 МЛ3 2

Как сделать, чтобы в 3-м столбце в строке итогов 3 учитывалась 1 раз так, как если бы не было дополнительной группировки по столбцу [Наименование маршрутного листа]? Нужно использовать оконные функции?
15 янв 21, 14:21    [22263920]     Ответить | Цитировать Сообщить модератору
 Re: Как перестроить запрос с использованием оконных функций?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8346
Борис Гаркун,

если номер МЛ не имеет значения выбирайте максимальный или минимальный, либо заменяйте его на пустую строку и группируйте по вычисляемому значению.
15 янв 21, 14:28    [22263924]     Ответить | Цитировать Сообщить модератору
 Re: Как перестроить запрос с использованием оконных функций?  [new]
Борис Гаркун
Member

Откуда: Лермонтов
Сообщений: 250
Владислав Колосов, номера МЛ нужны в детализированных строках. То, что суммируется в 3-м столбце есть характеристика того, что отображается в 1-м(количество точек учета есть характеристика ТП другими словами). Только в супер итогах(когда и в 1-м, и во 2-м столбцах значение Итого) нужно суммировать так, как будто нет группировки по 2-му столбцу
15 янв 21, 14:37    [22263933]     Ответить | Цитировать Сообщить модератору
 Re: Как перестроить запрос с использованием оконных функций?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8346
Борис Гаркун,

вы хотите пойти против законов природы? Если в наборе данных две тройки, то почему одну из них не надо учитывать?
Делайте без rollup в таком случае. Выбирайте данные и "подвал" через union all запрос, подвал сгруппируйте как требуется.
Для правильной сортировки добавите сортировочный атрибут, для первого запроса значение 0, для второго значение 1, сортируйте по этому атрибуту и другим, каким нужно.
15 янв 21, 16:21    [22263996]     Ответить | Цитировать Сообщить модератору
 Re: Как перестроить запрос с использованием оконных функций?  [new]
vikkiv
Member

Откуда: EU
Сообщений: 2920
?? как альтернатива grouping sets может даже в комбинации с coalesce()/isnull()
есть ещё count() (и даже с distinct), можно добавить дополнительные условия фильтрации через having
но без полноценной постановки задачи всё пальцем в небо

Сообщение было отредактировано: 15 янв 21, 16:48
15 янв 21, 16:50    [22264045]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить