Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Titik akhir analitik SQL di Microsoft Fabric
Gudang di Microsoft Fabric
Database SQL di Microsoft Fabric
SELECT Klausa pernyataan yang membagi hasil kueri menjadi grup baris, biasanya dengan melakukan satu atau beberapa agregasi pada setiap grup. Pernyataan SELECT mengembalikan satu baris untuk setiap grup.
Artikel ini menyediakan sintaks, argumen, keterangan, izin, dan contoh yang berbeda berdasarkan versi produk yang dipilih. Pilih versi produk yang Anda inginkan dari daftar dropdown versi.
Syntax
Sintaks yang sesuai dengan ISO untuk SQL Server, Azure SQL Database, Azure SQL Managed Instance, dan database SQL di Fabric:
GROUP BY {
column-expression
| ROLLUP ( <group_by_expression> [ , ...n ] )
| CUBE ( <group_by_expression> [ , ...n ] )
| GROUPING SETS ( <grouping_set> [ , ...n ] )
| () --calculates the grand total
} [ , ...n ]
<group_by_expression> ::=
column-expression
| ( column-expression [ , ...n ] )
<grouping_set> ::=
() --calculates the grand total
| <grouping_set_item>
| ( <grouping_set_item> [ , ...n ] )
<grouping_set_item> ::=
<group_by_expression>
| ROLLUP ( <group_by_expression> [ , ...n ] )
| CUBE ( <group_by_expression> [ , ...n ] )
Sintaks yang tidak sesuai ISO hanya untuk kompatibilitas mundur:
GROUP BY {
ALL column-expression [ , ...n ]
| column-expression [ , ...n ] WITH { CUBE | ROLLUP }
}
Sintaks untuk Azure Synapse Analytics:
GROUP BY {
column-name [ WITH (DISTRIBUTED_AGG) ]
| column-expression
| ROLLUP ( <group_by_expression> [ , ...n ] )
} [ , ...n ]
Sintaks untuk endpoint analitik Fabric Data Warehouse dan SQL:
ALL
| {
column-expression
| ROLLUP ( <group_by_expression> [ , ...n ] )
| CUBE ( <group_by_expression> [ , ...n ] )
| GROUPING SETS ( <grouping_set> [ , ...n ] )
| () --calculates the grand total
} [ , ...n ]
<group_by_expression> ::=
column-expression
| ( column-expression [ , ...n ] )
<grouping_set> ::=
() --calculates the grand total
| <grouping_set_item>
| ( <grouping_set_item> [ , ...n ] )
<grouping_set_item> ::=
<group_by_expression>
| ROLLUP ( <group_by_expression> [ , ...n ] )
| CUBE ( <group_by_expression> [ , ...n ] )
Arguments
column-expression
Menentukan kolom atau perhitungan nonagregat pada kolom. Kolom ini bisa menjadi milik tabel, tabel turunan, atau tampilan. Kolom harus muncul dalam FROM klausa SELECT pernyataan, tetapi tidak perlu muncul dalam SELECT daftar.
Untuk ekspresi yang valid, lihat ekspresi.
Kolom harus muncul dalam FROM klausa SELECT pernyataan, tetapi tidak diperlukan untuk muncul dalam SELECT daftar. Namun, Anda harus menyertakan setiap tabel atau kolom tampilan dalam GROUP BY daftar jika Anda menggunakannya dalam ekspresi nonaggregate apa pun dalam <select> daftar.
Opsi GROUP BY
Opsi berikut memperluas klausul dasar GROUP BY untuk mendukung agregasi hierarkis, ringkasan multidimensi, kombinasi pengelompokan kustom, dan perilaku eksekusi khusus platform. Kueri dapat menggunakan opsi ini untuk menghasilkan subtotal dan total keseluruhan dalam satu operasi logis.
ROLLUP ( <group_by_expression> [ , ... n ] )
Menghasilkan subtotal hierarkis untuk kolom yang tercantum dan total keseluruhan akhir (misalnya,
(a,b,c),(a,b),(a),()). Gunakan untuk laporan penelusuran seperti setahun>kuartal>bulan.CUBE ( <group_by_expression> [ , ... n ] )
Menghasilkan semua kombinasi kolom yang ditentukan (kisi 2^n lengkap) ditambah total keseluruhan. Gunakan untuk analisis multi-dimensi di setiap ipotong.
GROUPING SETS ( <grouping_set> [ , ... n ] )
Menentukan pengelompokan yang tepat untuk menghitung (termasuk
()total keseluruhan) dalam satu pass. Opsi ini secara fungsional miripUNION ALLdengan beberapaGROUP BYkueri tetapi dioptimalkan bersama-sama.() (set pengelompokan kosong)
Singkatan untuk menghitung hanya total keseluruhan di semua baris. Gunakan sendiri sebagai
GROUP BY ()atau di dalamGROUPING SETS.SEMUA ekspresi kolom [ , ... n ](non-ISO; kompatibilitas mundur)
Singkatan untuk mengelompokkan menurut semua item pilih nonaggregated. Dipertahankan untuk kompatibilitas; ketersediaan dan semantik bervariasi.
column-expression [ , ... n ] WITH { CUBE | 'ROLLUP }(formulir warisan)
Sintaksis non-ISO yang lebih lama dan setara
GROUP BY CUBE(...)dengan atauGROUP BY ROLLUP(...). Didukung hanya untuk kompatibilitas mundur. Gunakan subklaus ISO jika memungkinkan.DENGAN (DISTRIBUTED_AGG)
Petunjuk eksekusi terdistribusi untuk agregasi saat mengelompokkan menurut satu kolom. Hanya pool SQL khusus Azure Synapse Analytics yang mendukung opsi ini.
GROUP BY column-expression [ ,... n ]
Mengelompokkan hasil SELECT pernyataan sesuai dengan nilai dalam daftar satu atau beberapa ekspresi kolom.
Misalnya, kueri ini membuat Sales tabel dengan kolom untuk Region, Territory, dan Sales. Ini menyisipkan empat baris, dan dua baris memiliki nilai yang cocok untuk Region dan Territory.
CREATE TABLE Sales
(
Region VARCHAR (50),
Territory VARCHAR (50),
Sales INT
);
GO
INSERT INTO Sales VALUES (N'Canada', N'Alberta', 100);
INSERT INTO Sales VALUES (N'Canada', N'British Columbia', 200);
INSERT INTO Sales VALUES (N'Canada', N'British Columbia', 300);
INSERT INTO Sales VALUES (N'United States', N'Montana', 100);
Tabel Sales berisi baris-baris ini:
| Region | Wilayah | Sales |
|---|---|---|
| Canada | Alberta | 100 |
| Canada | Kolombia Inggris | 200 |
| Canada | Kolombia Inggris | 300 |
| Amerika Serikat | Montana | 100 |
Kueri berikutnya ini mengelompokkan Region dan Territory dan mengembalikan jumlah agregat untuk setiap kombinasi nilai.
SELECT Region,
Territory,
SUM(sales) AS TotalSales
FROM Sales
GROUP BY Region, Territory;
Hasil kueri memiliki tiga baris karena ada tiga kombinasi nilai untuk Region dan Territory.
TotalSales Untuk Kanada dan British Columbia adalah jumlah dua baris.
| Region | Wilayah | TotalSales |
|---|---|---|
| Canada | Alberta | 100 |
| Canada | Kolombia Inggris | 500 |
| Amerika Serikat | Montana | 100 |
Ekspresi kolom dalam GROUP BY tidak dapat memuat elemen-elemen berikut:
- Ekspresi
GROUP BYkolom tidak boleh berisi alias kolom yang Anda definisikan dalamSELECTdaftar. Ini dapat menggunakan alias kolom untuk tabel turunan yang ditentukan dalamFROMklausa. - Ekspresi
GROUP BYkolom tidak boleh berisi kolom teks tipe, nteks, atau gambar. Namun, Anda dapat menggunakan kolom teks, ntext, atau gambar sebagai argumen ke fungsi yang mengembalikan nilai tipe data yang valid. Misalnya, ekspresi dapat menggunakanSUBSTRING()danCAST(). Aturan ini juga berlaku untuk ekspresi dalamHAVINGklausa. - Ekspresi
GROUP BYkolom tidak boleh berisi metode tipe data xml . Fitur ini dapat mencakup fungsi yang ditentukan pengguna atau kolom terhitung yang menggunakan metode tipe data xml . - Ekspresi
GROUP BYkolom tidak dapat berisi subquery; query mengembalikan error 144. - Ekspresi
GROUP BYkolom tidak boleh berisi kolom dari tampilan terindeks.
Pernyataan berikut diizinkan:
SELECT ColumnA,
ColumnB
FROM T
GROUP BY ColumnA, ColumnB;
SELECT ColumnA + ColumnB
FROM T
GROUP BY ColumnA, ColumnB;
SELECT ColumnA + ColumnB
FROM T
GROUP BY ColumnA + ColumnB;
SELECT ColumnA + ColumnB + constant
FROM T
GROUP BY ColumnA, ColumnB;
Pernyataan berikut tidak diizinkan:
SELECT ColumnA,
ColumnB
FROM T
GROUP BY ColumnA + ColumnB;
SELECT ColumnA + constant + ColumnB
FROM T
GROUP BY ColumnA + ColumnB;
KELOMPOKKAN MENURUT SEMUA
Berlaku untuk: endpoint analitik Fabric Data Warehouse dan SQL
Mengelompokkan baris dalam kueri berdasarkan semua ekspresi yang tidak digabungkan dalam SELECT daftar, tanpa mengharuskan Anda secara eksplisit mencantumkannya dalam GROUP BY <columns> klausa.
GROUP BY ALL Menyederhanakan kueri agregat dengan mengelompokkan secara otomatis pada setiap kolom yang dipilih yang bukan bagian dari fungsi agregat.
Sintaks ini GROUP BY ALL hanya berlaku untuk Fabric Data Warehouse dan endpoint SQL analytics. Sintaks ini GROUP BY ALL saat ini tidak tersedia di SQL Server, Azure SQL Database, Azure SQL Managed Instance, atau database SQL di Fabric. Untuk platform tersebut, gunakan sintaks ekspresi kolom GROUP BY ALL.
-
GROUP BY ALLmengidentifikasi semua ekspresi dalamSELECTdaftar. -
GROUP BY ALLmengecualikan ekspresi yang dibungkus dalam fungsi agregat. -
GROUP BY ALLgrup berdasarkan semua ekspresi yang tersisa. -
GROUP BY ALLtidak mengubah semantik kueri—hanya sintaks. Menambahkan kolom baru yang tidak teragregasi keSELECTdaftar secara otomatis memengaruhi pengelompokan.
Berbeda dengan klausa eksplisit GROUP BY <columns> , yang menimbulkan kesalahan jika kolom yang dipilih tidak termasuk dalam kunci pengelompokan, GROUP BY ALL secara otomatis menambahkan semua kolom yang tidak teragregasi dari SELECT daftar ke set pengelompokan. Pendekatan ini menghindari kesalahan tersebut Column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause .
Warning
Menambahkan banyak kolom ke kumpulan grup dapat berdampak negatif pada kinerja query.
Jika Anda membutuhkan kontrol yang presisi atas pengelompokan kunci, gunakan klausa eksplisit GROUP BY <columns> dan proyeksikan kolom tambahan yang tidak teragregasi dengan menerapkan fungsi agregat ringan seperti ANY_VALUE.
Contoh berikut menunjukkan cara menggunakannya GROUP BY ALL dengan dataset yang sama dengan GROUP BY <columns> contoh untuk memudahkan perbandingan perilaku dan hasil.
SELECT
Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ALL;
GROUP BY ALL secara implisit mengelompokkan berdasarkan Region dan Territory karena mereka adalah satu-satunya ekspresi non-agregasi dalam SELECT daftar.
Hasil kueri memiliki tiga baris karena ada tiga kombinasi nilai untuk Region dan Territory.
TotalSales Untuk Kanada dan British Columbia adalah jumlah dua baris.
| Region | Wilayah | TotalSales |
|---|---|---|
| Canada | Alberta | 100 |
| Canada | Kolombia Inggris | 500 |
| Amerika Serikat | Montana | 100 |
Perilaku ini secara fungsional setara dengan mencantumkan secara eksplisit semua kolom yang tidak teragregasi dalam klausa tersebut GROUP BY .
KELOMPOK BERDASARKAN ROLLUP ()
Membuat grup untuk setiap kombinasi ekspresi kolom. Selain itu, ini menggulung hasil menjadi subtotal dan total keseluruhan. Saat membuat grup, grup berpindah dari kanan ke kiri, mengurangi jumlah ekspresi kolom untuk pengelompokan dan agregasi.
Urutan kolom memengaruhi ROLLUP output dan dapat memengaruhi jumlah baris dalam tataan hasil.
Misalnya, GROUP BY ROLLUP (col1, col2, col3, col4) membuat grup untuk setiap kombinasi ekspresi kolom dalam daftar berikut:
- kol1, kol2, kol3, kol4
- kol1, kol2, kol3, NULL
- col1, col2, NULL, NULL
- col1, NULL, NULL, NULL
- NULL, NULL, NULL, NULL (Grup dengan
NULLnilai adalah total keseluruhan)
Menggunakan tabel dari contoh sebelumnya, kode ini menjalankan GROUP BY ROLLUP operasi alih-alih dasar GROUP BY.
SELECT Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ROLLUP(Region, Territory);
Hasil kueri memiliki agregasi yang sama dengan dasar GROUP BY tanpa ROLLUP. Selain itu, ini membuat subtotal untuk setiap nilai Wilayah. Akhirnya, memberikan total keseluruhan untuk semua baris. Hasilnya terlihat seperti ini:
| Region | Wilayah | TotalSales |
|---|---|---|
| Canada | Alberta | 100 |
| Canada | Kolombia Inggris | 500 |
| Canada | NULL | 600 |
| Amerika Serikat | Montana | 100 |
| Amerika Serikat | NULL | 100 |
| NULL | NULL | 700 |
KELOMPOKKAN MENURUT KUBUS ()
GROUP BY CUBE membuat grup untuk semua kemungkinan kombinasi kolom. Untuk GROUP BY CUBE (a, b), hasilnya memiliki grup untuk nilai unik , (a, b), (NULL, b), (a, NULL)dan (NULL, NULL).
Menggunakan tabel dari contoh sebelumnya, kode ini menjalankan GROUP BY CUBE operasi di Wilayah dan Wilayah.
SELECT Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY CUBE(Region, Territory);
Hasil kueri memiliki grup untuk nilai (Region, Territory)unik , , (NULL, Territory), (Region, NULL)dan (NULL, NULL). Hasilnya terlihat seperti ini:
| Region | Wilayah | TotalSales |
|---|---|---|
| Canada | Alberta | 100 |
| NULL | Alberta | 100 |
| Canada | Kolombia Inggris | 500 |
| NULL | Kolombia Inggris | 500 |
| Amerika Serikat | Montana | 100 |
| NULL | Montana | 100 |
| NULL | NULL | 700 |
| Canada | NULL | 600 |
| Amerika Serikat | NULL | 100 |
MENGELOMPOKKAN MENURUT KUMPULAN PENGELOMPOKAN ()
Opsi menggabungkan GROUPING SETS beberapa GROUP BY klausa ke dalam satu GROUP BY klausa. Hasilnya sama dengan menggunakan UNION ALL pada grup yang ditentukan.
Misalnya, GROUP BY ROLLUP (Region, Territory) dan GROUP BY GROUPING SETS ( ROLLUP (Region, Territory)) mengembalikan hasil yang sama.
Ketika GROUPING SETS memiliki dua elemen atau lebih, hasilnya adalah persatuan elemen. Contoh ini mengembalikan persatuan ROLLUP hasil dan CUBE untuk Wilayah dan Wilayah.
SELECT Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY GROUPING SETS(ROLLUP(Region, Territory), CUBE(Region, Territory));
Hasilnya sama dengan kueri ini yang mengembalikan gabungan dari dua GROUP BY pernyataan.
SELECT Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ROLLUP(Region, Territory)
UNION ALL
SELECT Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY CUBE(Region, Territory);
SQL tidak mengonsolidasikan grup duplikat yang dihasilkan untuk GROUPING SETS daftar. Misalnya, di GROUP BY ((), CUBE (Region, Territory)), kedua elemen mengembalikan baris untuk total keseluruhan, dan kedua baris muncul dalam hasil.
Dukungan untuk fitur ISO dan ANSI SQL-2006 GROUP BY
Klausa GROUP BY ini mendukung semua GROUP BY fitur yang disertakan dalam standar SQL-2006 dengan pengecualian sintaks berikut:
Kumpulan pengelompokan tidak diizinkan dalam
GROUP BYklausul kecuali merupakan bagian dari daftar eksplisitGROUPING SETS. Misalnya,GROUP BY Column1, (Column2, ...ColumnN)diizinkan dalam standar tetapi tidak dalam Transact-SQL. Transact-SQL mendukungGROUP BY C1, GROUPING SETS ((Column2, ...ColumnN))danGROUP BY Column1, Column2, ... ColumnN, yang setara secara semantik. Klausa ini secara semantik setara dengan contoh sebelumnyaGROUP BY. Pembatasan ini menghindari kemungkinan yangGROUP BY Column1, (Column2, ...ColumnN)dapat disalahartikan sebagaiGROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)), yang tidak setara secara semantik.Kumpulan pengelompokan tidak diizinkan di dalam kumpulan pengelompokan. Misalnya,
GROUP BY GROUPING SETS (A1, A2,...An, GROUPING SETS (C1, C2, ...Cn))diizinkan dalam standar SQL-2006 tetapi tidak dalam Transact-SQL. Transact-SQL memungkinkanGROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn)atauGROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn)), yang secara semantik setara dengan contoh pertamaGROUP BYdan memiliki sintaks yang lebih jelas.
KELOMPOKKAN MENURUT ()
Menentukan grup kosong, yang menghasilkan total keseluruhan. Grup ini berguna sebagai salah satu elemen dari GROUPING SET. Misalnya, pernyataan ini memberikan total penjualan untuk setiap wilayah dan kemudian memberikan total keseluruhan untuk semua wilayah.
SELECT Region,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY GROUPING SETS(Region, ());
GROUP BY ALL column-expression [ ,... n ]
Berlaku untuk: SQL Server, Azure SQL Database, Azure SQL Managed Instance, dan database SQL di Fabric
Note
Gunakan sintaks ini hanya untuk kompatibilitas mundur. Hindari menggunakan sintaks ini dalam pekerjaan pengembangan baru, dan rencanakan untuk memodifikasi aplikasi yang saat ini menggunakan sintaks ini.
GROUP BY ALL Sintaks T-SQL berbeda dalam Fabric Data Warehouse. Untuk versi Fabric Data Warehouse dari artikel ini, lihat PILIH - KELOMPOK BERDASARKAN untuk Fabric Data Warehouse.
Menentukan apakah akan menyertakan semua grup dalam hasil, terlepas dari apakah mereka memenuhi kriteria pencarian dalam WHERE klausa. Grup yang tidak memenuhi kriteria pencarian memiliki NULL agregasi.
-
GROUP BY ALL {columns}tidak didukung dalam kueri yang mengakses tabel jarak jauh jika juga ada klausaWHEREdalam kueri. -
GROUP BY ALL {columns}gagal pada kolom yang memiliki atribut FILESTREAM.
Dukungan untuk fitur ISO dan ANSI SQL-2006 GROUP BY
Klausa GROUP BY ini mendukung semua GROUP BY fitur yang disertakan dalam standar SQL-2006 dengan pengecualian sintaks berikut:
- Anda hanya dapat menggunakan
GROUP BY ALLdanGROUP BY DISTINCTdalam klausa dasarGROUP BYyang berisi ekspresi kolom. Anda tidak dapat menggunakannya denganGROUPING SETSkonstruksi , ,ROLLUPCUBE,WITH CUBE, atauWITH ROLLUP.ALLadalah default dan implisit. Anda hanya dapat menggunakannya dalam sintaksis kompatibel mundur.
EKSPRESI kolom GROUP BY [ ,... n ] DENGAN { CUBE | ROLLUP }
Berlaku untuk: SQL Server, Azure SQL Database, Azure SQL Managed Instance, dan database SQL di Fabric
Legacy GROUP BY <column-expression> WITH CUBE dan GROUP BY <column-expression> WITH ROLLUP sintaks hanya didukung untuk kompatibilitas mundur.
Note
Gunakan sintaks ini hanya untuk kompatibilitas mundur. Hindari menggunakan sintaks ini dalam pekerjaan pengembangan baru, dan rencanakan untuk memodifikasi aplikasi yang saat ini menggunakan sintaks ini.
DENGAN (DISTRIBUTED_AGG)
Aplikasi untuk: Azure Synapse Analytics
DISTRIBUTED_AGG Petunjuk kueri tidak didukung di database SQL Server, Azure SQL Database, Azure SQL Managed Instance, SQL di Fabric, atau Fabric Data Warehouse.
DISTRIBUTED_AGG Petunjuk kueri memaksa sistem pemrosesan paralel besar-besaran (MPP) untuk mendistribusikan ulang tabel pada kolom tertentu sebelum melakukan agregasi. Anda bisa menggunakan DISTRIBUTED_AGG petunjuk kueri hanya pada satu kolom dalam GROUP BY klausa. Setelah kueri selesai, tabel yang didistribusikan ulang akan dihilangkan. Tabel asli tidak diubah.
Note
DISTRIBUTED_AGG Petunjuk kueri memberikan kompatibilitas mundur, dan tidak meningkatkan kinerja untuk sebagian besar kueri. Secara default, MPP sudah mendistribusikan ulang data seperlunya untuk meningkatkan performa untuk agregasi.
Komentar
Cara GROUP BY berinteraksi dengan pernyataan SELECT
SELECT Daftar:
- Agregat vektor. Jika Anda menyertakan fungsi agregat dalam
SELECTdaftar,GROUP BYmenghitung nilai ringkasan untuk setiap grup. Fungsi-fungsi ini dikenal sebagai agregat vektor. - Agregat yang berbeda. Agregat
AVG(DISTINCT <column_name>), ,COUNT(DISTINCT <column_name>)danSUM(DISTINCT <column_name>)bekerja denganROLLUP, ,CUBEdanGROUPING SETS.
WHERE Klausul:
- SQL menghapus baris yang tidak memenuhi kondisi dalam
WHEREklausa sebelum melakukan operasi pengelompokan apa pun.
HAVING Klausul:
- SQL menggunakan klausul
HAVINGuntuk memfilter grup dalam tataan hasil.
ORDER BY Klausul:
-
ORDER BYGunakan klausa untuk mengurutkan tataan hasil. KlausaGROUP BYtidak mengurutkan tataan hasil.
nilai NULL:
- Jika kolom pengelompokan berisi
NULLnilai, Mesin Database memperlakukan semuaNULLnilai sama dan mengumpulkannya ke dalam satu grup.
Keterbatasan
Berlaku untuk: SQL Server dan Azure Synapse Analytics
GROUP BY Untuk klausa ROLLUPyang menggunakan , , CUBEatau GROUPING SETS, jumlah maksimum ekspresi adalah 32. Jumlah maksimum grup adalah 4.096 (212). Contoh berikut gagal karena GROUP BY klausul memiliki lebih dari 4.096 grup.
Contoh berikut menghasilkan 4.097 (212 + 1) kumpulan pengelompokan lalu gagal.
GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b)Contoh berikut menghasilkan 4.097 (212 + 1) grup lalu gagal. Baik
CUBE ()dan()set pengelompokan menghasilkan baris total keseluruhan dan kumpulan pengelompokan duplikat tidak dihilangkan.GROUP BY GROUPING SETS( CUBE(a1, ..., a12), ())Contoh ini menggunakan sintaksis yang kompatibel dengan mundur. Ini menghasilkan 8.192 (213) kumpulan pengelompokan dan kemudian gagal.
GROUP BY CUBE (a1, ..., a13) GROUP BY a1, ..., a13 WITH CUBEUntuk klausa kompatibel
GROUP BYmundur yang tidak berisiCUBEatauROLLUP,GROUP BYukuran kolom, kolom agregat, dan nilai agregat yang terlibat dalam kueri membatasi jumlahGROUP BYitem. Batas ini berasal dari batas 8.060 byte pada worktable perantara yang menyimpan hasil kueri perantara. Anda dapat menggunakan maksimum 12 ekspresi pengelompokan saat MenentukanCUBEatauROLLUP.
Perbandingan fitur GROUP BY yang didukung
Tabel berikut ini menjelaskan GROUP BY fitur yang didukung produk yang berbeda.
| Feature | Layanan Integrasi SQL Server (SSIS) | SQL Server 1 |
|---|---|---|
DISTINCT Agregat |
Tidak didukung untuk WITH CUBE atau WITH ROLLUP. |
Didukung untuk WITH CUBE, , WITH ROLLUPGROUPING SETS, CUBE, atau ROLLUP. |
Fungsi yang ditentukan pengguna dengan CUBE atau ROLLUP nama dalam GROUP BY klausa |
Fungsi dbo.cube(<arg1>, ...<argN>) yang ditentukan pengguna atau dbo.rollup(<arg1>, ...<argN>) dalam GROUP BY klausul diizinkan.Misalnya: SELECT SUM (x) FROM T GROUP BY dbo.cube(y); |
Fungsi yang ditentukan dbo.cube (<arg1>, ...<argN>) pengguna atau dbo.rollup(<arg1>, ...<argN>) dalam GROUP BY klausul tidak diizinkan.Misalnya: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);SQL Server mengembalikan pesan kesalahan 2. Untuk menghindari masalah ini, ganti dbo.cube dengan [dbo].[cube] atau dbo.rollup dengan [dbo].[rollup].Contoh berikut diizinkan: SELECT SUM (x) FROM T GROUP BY [dbo].[cube](y); |
GROUPING SETS |
Tidak didukung | Supported |
CUBE |
Tidak didukung | Supported |
ROLLUP |
Tidak didukung | Supported |
Total keseluruhan, seperti GROUP BY() |
Tidak didukung | Supported |
fungsi GROUPING_ID |
Tidak didukung | Supported |
fungsi GROUPING |
Supported | Supported |
WITH CUBE |
Supported | Supported |
WITH ROLLUP |
Supported | Supported |
WITH CUBE atau WITH ROLLUP penghapusan pengelompokan "duplikat" |
Supported | Supported |
1Tingkat kompatibilitas database 100 dan yang lebih tinggi.
2 Pesan kesalahan yang dikembalikan adalah: Incorrect syntax near the keyword 'cube'|'rollup'.
Examples
Contoh kode dalam artikel ini menggunakan AdventureWorks2025database , AdventureWorksDW2025, atau AdventureWorksLT2025 contoh, yang dapat Anda unduh dari repositori GitHub Azure Data SQL Samples Repository.
A. Menggunakan klausa GROUP BY dasar
Contoh berikut mengambil total untuk masing-masing SalesOrderID dari SalesOrderDetail tabel. Contoh ini menggunakan AdventureWorks.
SELECT SalesOrderID,
SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail AS sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
B. Menggunakan klausa GROUP BY dengan beberapa tabel
Contoh berikut mengambil jumlah karyawan untuk masing-masing City dari tabel yang Address digabungkan ke EmployeeAddress tabel. Contoh ini menggunakan AdventureWorks.
SELECT a.City,
COUNT(bea.AddressID) AS EmployeeCount
FROM Person.BusinessEntityAddress AS bea
INNER JOIN Person.Address AS a
ON bea.AddressID = a.AddressID
GROUP BY a.City
ORDER BY a.City;
C. Menggunakan klausa GROUP BY dengan ekspresi
Contoh berikut mengambil total penjualan untuk setiap tahun dengan menggunakan DATEPART fungsi . Anda harus menyertakan ekspresi yang sama dalam SELECT daftar dan GROUP BY klausa.
SELECT DATEPART(yyyy, OrderDate) AS N'Year',
SUM(TotalDue) AS N'Total Order Amount'
FROM Sales.SalesOrderHeader
GROUP BY DATEPART(yyyy, OrderDate)
ORDER BY DATEPART(yyyy, OrderDate);
D. Menggunakan klausa GROUP BY dengan klausa HAVING
Contoh berikut menggunakan klausul HAVING untuk menentukan grup mana yang dihasilkan dalam GROUP BY klausa yang harus disertakan dalam tataan hasil.
SELECT DATEPART(yyyy, OrderDate) AS N'Year',
SUM(TotalDue) AS N'Total Order Amount'
FROM Sales.SalesOrderHeader
GROUP BY DATEPART(yyyy, OrderDate)
HAVING DATEPART(yyyy, OrderDate) >= N'2003'
ORDER BY DATEPART(yyyy, OrderDate);
Contoh: Azure Synapse Analytics
E. Penggunaan dasar klausa GROUP BY
Contoh berikut menemukan jumlah total untuk semua penjualan pada setiap hari. Kueri mengembalikan satu baris yang berisi jumlah semua penjualan untuk setiap hari.
-- Uses AdventureWorksDW
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
F. Penggunaan dasar petunjuk DISTRIBUTED_AGG
Contoh ini menggunakan petunjuk kueri DISTRIBUTED_AGG untuk memaksa appliance mengacak tabel pada CustomerKey kolom sebelum melakukan agregasi.
-- Uses AdventureWorksDW
SELECT CustomerKey,
SUM(SalesAmount) AS sas
FROM FactInternetSales
GROUP BY CustomerKey WITH(DISTRIBUTED_AGG)
ORDER BY CustomerKey DESC;
G. Variasi sintaks untuk GROUP BY
Saat daftar pilih tidak memiliki agregasi, Anda harus menyertakan setiap kolom dalam daftar pilih dalam GROUP BY daftar. Anda dapat menyertakan kolom komputasi dalam daftar pilih, tetapi Anda tidak diharuskan untuk menyertakannya dalam GROUP BY daftar. Contoh-contoh ini menunjukkan pernyataan yang valid SELECT secara sintis:
-- Uses AdventureWorks
SELECT LastName,
FirstName
FROM DimCustomer
GROUP BY LastName, FirstName;
SELECT NumberCarsOwned
FROM DimCustomer
GROUP BY YearlyIncome, NumberCarsOwned;
SELECT (SalesAmount + TaxAmt + Freight) AS TotalCost
FROM FactInternetSales
GROUP BY SalesAmount, TaxAmt, Freight;
SELECT SalesAmount,
SalesAmount * 1.10 AS SalesTax
FROM FactInternetSales
GROUP BY SalesAmount;
SELECT SalesAmount
FROM FactInternetSales
GROUP BY SalesAmount, SalesAmount * 1.10;
H. Menggunakan klausa GROUP BY dengan beberapa ekspresi GROUP BY
Contoh berikut mengelompokkan hasil menggunakan beberapa GROUP BY kriteria. Jika, dalam setiap OrderDateKey grup, subgrup ada yang nilainya DueDateKey membedakan, kueri menentukan pengelompokan baru untuk kumpulan hasil.
-- Uses AdventureWorks
SELECT OrderDateKey,
DueDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey, DueDateKey
ORDER BY OrderDateKey;
I. Menggunakan klausa GROUP BY dengan klausa HAVING
Contoh berikut menggunakan klausul HAVING untuk menentukan grup yang dihasilkan dalam GROUP BY klausul yang harus disertakan dalam tataan hasil. Hanya grup dengan tanggal pesanan pada tahun 2004 atau yang lebih baru yang disertakan dalam hasilnya.
-- Uses AdventureWorks
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
HAVING OrderDateKey > 20040000
ORDER BY OrderDateKey;