Group by (transact-sql)

Пропозиція GROUP BY має два синтаксису: сумісний з ISO і несумісний з ISO. У кожній окремій інструкції SELECT може використовуватися тільки один стиль синтаксису. У всіх нових розробках використовуйте сумісний з ISO синтаксис. Синтаксис, несумісний з ISO, служить для забезпечення зворотної сумісності.

В цьому розділі пропозиція GROUP BY можна описати як загальне або просте.

Загальна пропозиція GROUP BY включає конструкції GROUPING SETS, CUBE, ROLLUP, WITH CUBE і WITH ROLLUP.

Просте речення GROUP BY не включає конструкції GROUPING SETS, CUBE, ROLLUP, WITH CUBE і WITH ROLLUP. Пропозиція GROUP BY (), призначене для визначення загального підсумку, розглядається як просте речення GROUP BY.

Формується один рядок для кожного унікального поєднання значень (a, b, c). (A, b). (A, c). (B, c). (A). (B) і (c) з подитогом для кожного рядка і рядком загального підсумку.

Вихідні дані CUBE не залежить від порядку стовпців.

Вказує кілька угруповань даних в одному запиті. Виконується статистична обробка тільки зазначених груп, а не повного набору статистичних даних, які формуються за допомогою конструкцій CUBE або ROLLUP. Результати еквівалентні тим, що формуються із застосуванням конструкції UNION ALL до зазначених груп. Конструкція GROUPING SETS може містити єдиний елемент або список елементів. У конструкції GROUPING SETS можуть бути вказані групування, еквівалентні тим, які повертає конструкція ROLLUP або CUBE. Приклади см. В розділі Еквіваленти GROUPING SETS. <Список элементов группирующего набора> може містити конструкцію ROLLUP або CUBE.

Пуста група формує підсумок.

Синтаксис, несумісний з ISO

У майбутньої версії Microsoft SQL Server ця можливість буде видалена. Уникайте використання цієї можливості в нових розробках і заплануйте зміна існуючих додатків, в яких вона застосовується. Включає всі групи і результуючі набори (навіть не мають рядків), які задовольняють умові пошуку, зазначеним у реченні WHERE. Якщо заданий аргумент ALL, для зведених стовпців груп, що не відповідають умовам пошуку, повертаються значення NULL. Аргумент ALL можна вказувати з операторами CUBE або ROLLUP.

Пропозиція GROUP BY ALL не підтримуються в запитах з доступом до віддаленим таблицями, якщо в запиті присутній також пропозицію WHERE. Застосування пропозиції GROUP BY ALL до стовпців, які мають атрибут FILESTREAM, призведе до помилки.

Вираз. за яким виконується групування. Аргумент group_by_expression також називається стовпцем групування. Аргумент group_by expression може бути стовпцем або нестатистичні виразом, яке посилається на стовпець, що повертається пропозицією FROM. Ім'я користувача стовпчика, визначений у списку SELECT, не можна використовувати при вказівці стовпчика групування.

Стовпці типу text. ntext і image можна використовувати в аргументі group_by_expression.

Для пропозицій GROUP BY, що не містять операторів CUBE або ROLLUP, кількість елементів group_by_expression обмежується розміром стовпців GROUP BY, статистично обробляються стовпців і статистичних значень, включених в запит. Це пояснюється обмеженням розміру проміжної робочої таблиці (8 060 байт), необхідної для зберігання проміжних результатів запиту. При вказівці CUBE або ROLLUP максимально дозволену кількість виразів групування дорівнює 12.

Методи для типу даних xml не можна вказувати безпосередньо в аргументі group_by_expression. Замість цього слід створити посилання на призначену для користувача функцію, яка включає методи для типу даних xml або посилається на обчислюваний стовпець, який використовує ці методи.

У майбутньої версії Microsoft SQL Server ця можливість буде видалена. Уникайте використання цієї можливості в нових розробках і заплануйте зміна існуючих додатків, в яких вона застосовується. Вказує, що крім рядків, що надаються GROUP BY, в результуючий набір включаються зведені рядки. Зведена рядок GROUP BY повертається для всіх можливих поєднань груп і підгруп в результуючому наборі. Щоб визначити, чи становлять значення NULL в результуючому наборі зведені значення GROUP BY, використовуйте функцію GROUPING.

Кількість зведених рядків в результуючому наборі визначається за кількістю стовпців, включених в пропозицію GROUP BY. Оскільки оператор CUBE повертає всі можливі поєднання груп і підгруп, кількість рядків залишається тим же, незалежно від заданого порядку групування стовпців.

У майбутньої версії Microsoft SQL Server ця можливість буде видалена. Уникайте використання цієї можливості в нових розробках і заплануйте зміна існуючих додатків, в яких вона застосовується. Вказує, що крім рядків, що надаються GROUP BY, в результуючий набір включаються зведені рядки. Групи узагальнюються в ієрархічному порядку, починаючи з самого нижнього рівня в групі і закінчуючи самим верхнім. Ієрархія групи визначається порядком, в якому задані стовпці, по яким проводиться групування. Зміна порядку стовпців, по яких проводиться групування, може вплинути на кількість рядків у результуючому наборі.

Статистичні обчислення з ключовим словом DISTINCT, наприклад AVG (DISTINCT column_name), COUNT (DISTINCT column_name) і SUM (DISTINCT column_name), при використанні CUBE і ROLLUP не підтримуються. Якщо вони використовуються, то компонент SQL Server Database Engine повертає повідомлення про помилку і скасовує запит.

Якщо в пропозицію SELECT <список выбора> включені агрегатні функції, інструкція GROUP BY обчислює зведені значення для кожної групи. (Вони відомі як векторні статистичні вирази.)

Рядки, які не відповідають умовам в реченні WHERE, видаляються до виконання будь-яких операцій групування.

Пропозиція HAVING використовується з пропозицією GROUP BY для фільтрації груп в результуючому наборі.

Застосування пропозиції GROUP BY НЕ впорядковує результуючий набір. Щоб упорядкувати результуючий набір, необхідно використовувати пропозицію ORDER BY.

Якщо стовпець групування містить значення NULL, вони розглядаються як рівні і поміщаються в одну групу.

Не можна використовувати пропозицію GROUP BY з псевдонімом для заміни імені стовпця в реченні AS, якщо цей псевдонім не замінює ім'я стовпця в похідною таблиці в реченні FROM.

Повторювані набори групування в списку GROUPING SETS усуваються. Повторювані набори групування можуть бути сформовані, якщо вираз стовпця вказано більше одного разу або якщо входить в список вираз стовпчика сформовано також конструкцією CUBE або ROLLUP в списку GROUPING SETS.

З конструкціями ROLLUP, CUBE і GROUPING SETS підтримуються статистичні функції з ключовим словом DISTINCT, наприклад AVG (DISTINCT column_name), COUNT (DISTINCT column_name) і SUM (DISTINCT column_name).

Конструкції ROLLUP, CUBE і GROUPING SETS не можуть бути вказані в індексованих поданні.

Конструкції GROUP BY або HAVING не можуть використовуватися безпосередньо для стовпців типу ntext. text або image. Ці стовпці можуть використовуватися в якості аргументів у функціях, які повертають значення іншого типу даних, таких як SUBSTRING () і CAST ().

Методи даних типу xml не можуть бути вказані безпосередньо в аргументі . Замість цього слід створити посилання на призначену для користувача функцію, яка включає методи для типу даних xml або посилається на обчислюваний стовпець, який використовує ці методи.

Обмеження пропозиції GROUP BY для конструкцій GROUPING SETS, ROLLUP і CUBE

обмеження синтаксису

Не можна використовувати конструкції GROUPING SETS в реченні GROUP BY, якщо вони не входять до складу списку GROUPING SETS. Наприклад, форма GROUP BY C1, (C2. Cn) неприпустима, але форма GROUP BY GROUPING SETS (C1, (C2. Cn)) є допустимою.

Не можна використовувати ключові слова GROUPING SETS всередині самих конструкцій GROUPING SETS. Наприклад, вираз GROUP BY GROUPING SETS (C1, GROUPING SETS (C2, C3)) неприпустимо.

У реченні GROUP BY з ключовими словами ROLLUP, CUBE або GROUPING SETS не можна використовувати ключові слова ALL, WITH CUBE і WITH ROLLUP, несумісні з ISO.

обмеження розміру

Для простих речень GROUP BY кількість виразів не обмежена.

Для пропозиції GROUP BY, в якому використовуються ключові слова ROLLUP, CUBE або GROUPING SETS, максимальна кількість виразів дорівнює 32, а максимальна кількість группирующих наборів, які можуть бути створені, так само 4096 (2 12). Наступні приклади виявляться невдалими, оскільки пропозиція GROUP BY є занадто складним.

У наступних прикладах формуються 8192 (2 13) групуються наборів.

Застосування группирующих наборів в реченні GROUP BY неприпустимо, якщо вони не становлять частину явного списку GROUPING SETS. Наприклад, пропозиція GROUP BY Column1, (Column2. ColumnN) допускається в цьому стандарті, але не в SQL Server. Можна використовувати вираз GROUP BY C1, GROUPING SETS ((Column2. ColumnN)) або GROUP BY Column1, Column2. ColumnN. Ці інструкції семантично еквівалентні попереднього прикладу пропозиції GROUP BY. Це дозволяє уникнути можливості неправильної інтерпретації пропозиції GROUP BY Column1, (Column2. ColumnN) як GROUP BY C1, GROUPING SETS ((Column2. ColumnN)). Ця інструкція не є семантично еквівалентної.

Не можна застосовувати ключові слова GROUP BY [ALL / DISTINCT] в загальній пропозиції GROUP BY і в конструкціях GROUPING SETS, ROLLUP, CUBE, WITH CUBE або WITH ROLLUP. Ключове слово ALL застосовується за умовчанням і задано неявно.

Порівняння підтримуваних функцій пропозиції GROUP BY

У наведеній нижче таблиці описано підтримувані функції пропозиції GROUP BY з урахуванням версії SQL Server і рівня сумісності бази даних.

Схожі статті