Вы все знаете о Group by? А ты?

 SQL-это мощный язык, и SQL Server имеет так много функций, что невозможно быть экспертом во всем. Я вижу, что многие люди тяготеют к производительности, но это не лучшее место для сосредоточения внимания. Если вы не знаете основ языка, то вы никогда не будете лучшим оптимизаторм производительности.

Сегодня мы рассмотрим GROUPING SETSЭто аккуратная функция, которую я никогда не видел, чтобы кто-то использовал. Возможно, потому, что его значение ограничено для любых прикладных целей, где вы можете просто сгруппироваться в отчете или таблице данных. Где я думаю, что видел бы людей, использующих это, так это для задач, связанных с администрированием и обнаружением.

Предположим, что ваш менеджер хочет знать, сколько места используется на том и по типу файла данных. Как бы вы поступили дальше? Один из простых способов-запросить sys.master_files вырезает и вставляет данные в Excel. Оттуда вам нужно будет сделать еще несколько операций, и вы получите свой отчет. Другим способом может быть использование построителя отчетов для быстрого создания отчета. Но оба они гораздо медленнее, чем просто использование SQL для получения группировок.

Вот быстрый пример, чтобы получить общее использование в МБ по типу файла для каждого тома (когда не используются точки монтирования):

SELECT type_desc as FileType,
LEFT(physical_name, 1) as Volume,
SUM(size*8/1024) as [Size MB]
FROM
 sys.master_files
GROUP BY
GROUPING SETS (
                                           (type_desc, left(physical_name, 1)),
                                           (type_desc),
                                           (left(physical_name, 1))
                                    )

Использование GROUPING SETS дает нам промежуточный итог для каждого группирующего набора. Вот результат.:


Вы также можете использовать куб, но результат будет включать в себя дополнительный промежуточный итог, который может быть полезен.

SELECT type_desc as FileType, left(physical_name, 1) as Volume,
SUM(size*8/1024) as [Size MB]
FROM
 sys.master_files
GROUP BY CUBE
(type_desc, left(physical_name, 1))