PILIH - GROUP BY - T-SQL

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)Titik akhir analitik SQL di Microsoft FabricWarehouse di Microsoft Fabric

Klausa pernyataan SELECT yang membagi hasil kueri menjadi grup baris, biasanya dengan melakukan satu atau beberapa agregasi pada setiap grup. Pernyataan SELECT mengembalikan satu baris per grup.

Sintaks

Konvensi sintaks transact-SQL

-- Syntax for SQL Server and Azure SQL Database   
-- ISO-Compliant Syntax  
  
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 ] )  
  

-- For backward compatibility only.
-- Non-ISO-Compliant Syntax for SQL Server and Azure SQL Database 
  
GROUP BY {
       ALL column-expression [ ,...n ] 
    | column-expression [ ,...n ]  WITH { CUBE | ROLLUP }    
       }

-- Syntax for Azure Synapse Analytics 
  
GROUP BY {
      column-name [ WITH (DISTRIBUTED_AGG) ]  
    | column-expression
    | ROLLUP ( <group_by_expression> [ ,...n ] ) 
} [ ,...n ]

-- Syntax for Parallel Data Warehouse  
  
GROUP BY {
      column-name [ WITH (DISTRIBUTED_AGG) ]  
    | column-expression
} [ ,...n ]

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

ekspresi kolom

Menentukan kolom atau perhitungan non-agregat pada kolom. Kolom ini bisa menjadi milik tabel, tabel turunan, atau tampilan. Kolom harus muncul dalam klausa FROM dari pernyataan SELECT, tetapi tidak diperlukan untuk muncul dalam daftar SELECT.

Untuk ekspresi yang valid, lihat ekspresi.

Kolom harus muncul dalam klausa FROM dari pernyataan SELECT, tetapi tidak diperlukan untuk muncul dalam daftar SELECT. Namun, setiap tabel atau kolom tampilan dalam ekspresi nonaggregate apa pun dalam <daftar pilih> harus disertakan dalam daftar GROUP BY:

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;  

Ekspresi kolom tidak boleh berisi:

  • Alias kolom yang ditentukan dalam daftar SELECT. Ini dapat menggunakan alias kolom untuk tabel turunan yang ditentukan dalam klausa FROM.
  • Kolom jenis teks, ntext, 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 menggunakan SUBSTRING() dan CAST(). Ini juga berlaku untuk ekspresi dalam klausa HAVING.
  • metode jenis data xml. Ini dapat mencakup fungsi yang ditentukan pengguna yang menggunakan metode jenis data xml. Ini dapat menyertakan kolom komputasi yang menggunakan metode jenis data xml.
  • Subkueri. Kesalahan 144 dikembalikan.
  • Kolom dari tampilan terindeks.

GROUP BY column-expression [ ,... n ]

Mengelompokkan hasil pernyataan SELECT sesuai dengan nilai dalam daftar satu atau beberapa ekspresi kolom.

Misalnya, kueri ini membuat tabel Penjualan dengan kolom untuk Negara, Wilayah, dan Penjualan. Ini menyisipkan empat baris dan dua baris memiliki nilai yang cocok untuk Negara dan Wilayah.

CREATE TABLE Sales ( Country VARCHAR(50), Region VARCHAR(50), Sales INT );

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 Penjualan berisi baris-baris ini:

Negara Wilayah Penjualan
Kanada Alberta 100
Kanada British Columbia 200
Kanada British Columbia 300
Amerika Serikat Montana 100

Kueri berikutnya ini mengelompokkan Negara dan Wilayah dan mengembalikan jumlah agregat untuk setiap kombinasi nilai.

SELECT Country, Region, SUM(sales) AS TotalSales
FROM Sales
GROUP BY Country, Region;

Hasil kueri memiliki 3 baris karena ada 3 kombinasi nilai untuk Negara dan Wilayah. TotalSales untuk Kanada dan British Columbia adalah jumlah dua baris.

Negara Wilayah TotalSales
Kanada Alberta 100
Kanada British Columbia 500
Amerika Serikat Montana 100

GRUP BERDASARKAN ROLLUP

Membuat grup untuk setiap kombinasi ekspresi kolom. Selain itu, ia "menggulung" hasilnya menjadi subtotal dan total keseluruhan. Untuk melakukan ini, ia berpindah dari kanan ke kiri mengurangi jumlah ekspresi kolom tempatnya membuat grup dan agregasi.

Urutan kolom mempengaruhi output ROLLUP dan dapat mempengaruhi jumlah baris dalam tataan hasil.

Misalnya, GROUP BY ROLLUP (col1, col2, col3, col4) membuat grup untuk setiap kombinasi ekspresi kolom dalam daftar berikut.

  • col1, col2, col3, col4
  • col1, col2, col3, NULL
  • col1, col2, NULL, NULL
  • col1, NULL, NULL, NULL
  • NULL, NULL, NULL, NULL --Ini adalah total keseluruhan

Menggunakan tabel dari contoh sebelumnya, kode ini menjalankan operasi ROLLUP GROUP BY alih-alih GROUP BY sederhana.

SELECT Country, Region, SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ROLLUP (Country, Region);

Hasil kueri memiliki agregasi yang sama dengan GROUP BY sederhana tanpa ROLLUP. Selain itu, ini membuat subtotal untuk setiap nilai Negara. Akhirnya, memberikan total keseluruhan untuk semua baris. Hasilnya terlihat seperti ini:

Negara Wilayah TotalSales
Kanada Alberta 100
Kanada British Columbia 500
Kanada 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 operasi GROUP BY CUBE di Negara dan Wilayah.

SELECT Country, Region, SUM(Sales) AS TotalSales
FROM Sales
GROUP BY CUBE (Country, Region);

Hasil kueri memiliki grup untuk nilai unik (Negara, Wilayah), (NULL, Wilayah), (Negara, NULL), dan (NULL, NULL). Hasilnya terlihat seperti ini:

Negara Wilayah TotalSales
Kanada Alberta 100
NULL Alberta 100
Kanada British Columbia 500
NULL British Columbia 500
Amerika Serikat Montana 100
NULL Montana 100
NULL NULL 700
Kanada NULL 600
Amerika Serikat NULL 100

KELOMPOKKAN MENURUT KUMPULAN PENGELOMPOKAN ( )

Opsi GROUPING SETS memberi Anda kemampuan untuk menggabungkan beberapa klausa GROUP BY ke dalam satu klausa GROUP BY. Hasilnya setara dengan UNION ALL dari grup yang ditentukan.

Misalnya, GROUP BY ROLLUP (Country, Region) dan GROUP BY GROUPING SETS ( ROLLUP (Country, Region) ) mengembalikan hasil yang sama.

Ketika GROUPING SETS memiliki dua elemen atau lebih, hasilnya adalah persatuan elemen. Contoh ini mengembalikan persatuan hasil ROLLUP dan CUBE untuk Negara dan Wilayah.

SELECT Country, Region, SUM(Sales) AS TotalSales
FROM Sales
GROUP BY GROUPING SETS ( ROLLUP (Country, Region), CUBE (Country, Region) );

Hasilnya sama dengan kueri ini yang mengembalikan gabungan dari dua pernyataan GROUP BY.

SELECT Country, Region, SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ROLLUP (Country, Region)
UNION ALL
SELECT Country, Region, SUM(Sales) AS TotalSales
FROM Sales
GROUP BY CUBE (Country, Region);

SQL tidak mengonsolidasikan grup duplikat yang dihasilkan untuk daftar GROUPING SETS. Misalnya, dalam GROUP BY ( (), CUBE (Country, Region) ), kedua elemen mengembalikan baris untuk total keseluruhan dan kedua baris akan dicantumkan dalam hasil.

KELOMPOKKAN MENURUT ()

Menentukan grup kosong, yang menghasilkan total keseluruhan. Ini berguna sebagai salah satu elemen DARI GROUPING SET. Misalnya, pernyataan ini memberikan total penjualan untuk setiap negara/wilayah dan kemudian memberikan total keseluruhan untuk semua negara/wilayah.

SELECT Country, SUM(Sales) AS TotalSales
FROM Sales
GROUP BY GROUPING SETS ( Country, () );

GROUP BY ALL column-expression [ ,... n ]

Berlaku untuk: SQL Server dan Azure SQL Database

Catatan

Sintaks ini hanya disediakan untuk kompatibilitas mundur. Ini akan dihapus dalam versi mendatang. Hindari menggunakan sintaks ini dalam pekerjaan pengembangan baru, dan rencanakan untuk memodifikasi aplikasi yang saat ini menggunakan sintaks ini.

Menentukan untuk menyertakan semua grup dalam hasil terlepas dari apakah mereka memenuhi kriteria pencarian dalam klausa WHERE. Grup yang tidak memenuhi kriteria pencarian memiliki NULL untuk agregasi.

KELOMPOKKAN MENURUT SEMUA:

  • Tidak didukung dalam kueri yang mengakses tabel jarak jauh jika ada juga klausa WHERE dalam kueri.
  • Akan gagal pada kolom yang memiliki atribut FILESTREAM.

EKSPRESI kolom GROUP BY [ ,... n ] DENGAN { CUBE | ROLLUP }

Berlaku untuk: SQL Server dan Azure SQL Database

Catatan

Sintaks ini hanya disediakan untuk kompatibilitas mundur. Hindari menggunakan sintaks ini dalam pekerjaan pengembangan baru, dan rencanakan untuk memodifikasi aplikasi yang saat ini menggunakan sintaks ini.

WITH (DISTRIBUTED_AGG)

Berlaku untuk: Azure Synapse Analytics and Analytics Platform System (PDW)

Petunjuk kueri DISTRIBUTED_AGG memaksa sistem pemrosesan paralel besar-besaran (MPP) untuk mendistribusikan ulang tabel pada kolom tertentu sebelum melakukan agregasi. Hanya satu kolom dalam klausa GROUP BY yang dapat memiliki petunjuk kueri DISTRIBUTED_AGG. Setelah kueri selesai, tabel yang didistribusikan ulang akan dihilangkan. Tabel asli tidak diubah.

CATATAN: Petunjuk kueri DISTRIBUTED_AGG disediakan untuk kompatibilitas mundur dengan versi Analytics Platform System (PDW) sebelumnya dan tidak akan meningkatkan performa untuk sebagian besar kueri. Secara default, MPP sudah mendistribusikan ulang data seperlunya untuk meningkatkan performa untuk agregasi.

Keterangan Umum

Cara GROUP BY berinteraksi dengan pernyataan SELECT

DAFTAR SELECT:

  • Agregat vektor. Jika fungsi agregat disertakan dalam daftar SELECT, GROUP BY menghitung nilai ringkasan untuk setiap grup. Ini dikenal sebagai agregat vektor.
  • Agregat yang berbeda. AVG agregat (DISTINCT column_name), COUNT (DISTINCT column_name), dan SUM (DISTINCT column_name) didukung dengan ROLLUP, CUBE, dan GROUPING SETS.

Klausa WHERE:

  • SQL menghapus Baris yang tidak memenuhi kondisi dalam klausa WHERE sebelum operasi pengelompokan dilakukan.

Klausa HAVING:

  • SQL menggunakan klausul yang memiliki untuk memfilter grup dalam tataan hasil.

Klausa ORDER BY:

  • Gunakan klausa ORDER BY untuk mengurutkan tataan hasil. Klausa GROUP BY tidak mengurutkan tataan hasil.

Nilai NULL:

  • Jika kolom pengelompokan berisi nilai NULL, semua nilai NULL dianggap sama, dan dikumpulkan ke dalam satu grup.

Batasan dan Pembatasan

Berlaku untuk: SQL Server (dimulai dengan 2008) dan Azure Synapse Analytics

Kapasitas maksimum

Untuk klausa GROUP BY yang menggunakan ROLLUP, CUBE, atau GROUPING SETS, jumlah maksimum ekspresi adalah 32. Jumlah maksimum grup adalah 4096 (212). Contoh berikut gagal karena klausul GROUP BY memiliki lebih dari 4096 grup.

  • Contoh berikut menghasilkan set pengelompokan 4097 (212 + 1) dan akan gagal.

    GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b )  
    
  • Contoh berikut menghasilkan 4097 (212 + 1) grup dan akan 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 kompatibel mundur. Ini menghasilkan 8192 (213) kumpulan pengelompokan dan akan gagal.

    GROUP BY CUBE (a1, ..., a13)   
    GROUP BY a1, ..., a13 WITH CUBE   
    

    Untuk klausa GROUP BY yang kompatibel mundur yang tidak berisi CUBE atau ROLLUP, jumlah grup menurut item dibatasi oleh ukuran kolom GROUP BY, kolom agregat, dan nilai agregat yang terlibat dalam kueri. Batas ini berasal dari batas 8.060 byte pada worktable perantara yang diperlukan untuk menyimpan hasil kueri menengah. Maksimum 12 ekspresi pengelompokan diizinkan saat CUBE atau ROLLUP ditentukan.

Dukungan untuk FITUR ISO dan ANSI SQL-2006 GROUP BY

Klausa GROUP BY mendukung semua fitur GROUP BY yang disertakan dalam standar SQL-2006 dengan pengecualian sintaks berikut:

  • Kumpulan pengelompokan tidak diperbolehkan dalam klausul GROUP BY kecuali jika merupakan bagian dari daftar GROUPING SETS eksplisit. Misalnya, GROUP BY Column1, (Column2, ...ColumnN) diizinkan dalam standar tetapi tidak dalam Transact-SQL. Transact-SQL mendukung GROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)) dan GROUP BY Column1, Column2, ... ColumnN, yang setara secara semantik. Ini secara semantik setara dengan contoh sebelumnya GROUP BY . Ini untuk menghindari kemungkinan bahwa GROUP BY Column1, (Column2, ...ColumnN) mungkin disalahartikan sebagai GROUP 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 memungkinkan GROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn ) atau GROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn) ), yang secara semantik setara dengan contoh GROUP BY pertama dan memiliki sintaks yang lebih jelas.

  • GROUP BY [ALL/DISTINCT] hanya diizinkan dalam klausa GROUP BY sederhana yang berisi ekspresi kolom. Ini tidak diperbolehkan dengan KONSTRUKSI GROUPING SETS, ROLLUP, CUBE, WITH CUBE atau WITH ROLLUP. ALL adalah default dan implisit. Ini juga hanya diperbolehkan dalam sintaksis yang kompatibel mundur.

Perbandingan Fitur GROUP BY yang Didukung

Tabel berikut ini menjelaskan fitur GROUP BY yang didukung berdasarkan versi SQL dan tingkat kompatibilitas database.

Fitur Layanan Integrasi SQL Server Tingkat kompatibilitas SQL Server 100 atau lebih tinggi SQL Server 2008 atau yang lebih baru dengan tingkat kompatibilitas 90.
Agregat BERBEDA Tidak didukung untuk WITH CUBE atau WITH ROLLUP. Didukung untuk WITH CUBE, WITH ROLLUP, GROUPING SETS, CUBE, atau ROLLUP. Sama seperti tingkat kompatibilitas 100.
Fungsi yang ditentukan pengguna dengan nama CUBE atau ROLLUP dalam klausa GROUP BY Fungsi yang ditentukan pengguna dbo.cube(arg1,... argN) atau dbo.rollup(arg1,...argN) dalam klausul GROUP BY diizinkan.

Misalnya: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);
Dbo.cube fungsi yang ditentukan pengguna (arg1,... argN**)** atau dbo.rollup(arg1,... argN) dalam klausul GROUP BY tidak diizinkan.

Misalnya: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);

Pesan kesalahan berikut dikembalikan: "Sintaks yang salah di dekat kata kunci 'kubus'|' rollup'."

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);
Dbo.cube fungsi yang ditentukan pengguna (arg1,... argN) atau dbo.rollup(arg1,... argN) dalam klausul GROUP BY diizinkan

Misalnya: SELECT SUM (x) FROM T GROUP BY dbo.cube(y);
GROUPING SETS Tidak didukung Didukung Didukung
CUBE Tidak didukung Didukung Tidak didukung
ROLLUP Tidak didukung Didukung Tidak didukung
Total keseluruhan, seperti GROUP BY () Tidak didukung Didukung Didukung
fungsi GROUPING_ID Tidak didukung Didukung Didukung
Fungsi GROUPING Didukung Didukung Didukung
DENGAN KUBUS Didukung Didukung Didukung
DENGAN ROLLUP Didukung Didukung Didukung
DENGAN PENGHAPUSAN pengelompokan CUBE atau WITH ROLLUP "duplikat" Didukung Didukung Didukung

Contoh

J. Menggunakan klausa GROUP BY sederhana

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) 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 . Ekspresi yang sama harus ada 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 dan Gudang Data Paralel

E. Penggunaan dasar klausa GROUP BY

Contoh berikut menemukan jumlah total untuk semua penjualan pada setiap hari. Satu baris yang berisi jumlah semua penjualan dikembalikan 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, setiap kolom dalam daftar pilih harus disertakan dalam daftar GROUP BY. Kolom komputasi dalam daftar pilih dapat dicantumkan, tetapi tidak diperlukan, dalam daftar GROUP BY. Ini adalah contoh pernyataan SELECT yang valid 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 SalesTax FROM FactInternetSales GROUP BY SalesAmount;  
SELECT SalesAmount FROM FactInternetSales GROUP BY SalesAmount, SalesAmount*1.10;  

H. Menggunakan GROUP BY dengan beberapa ekspresi GROUP BY

Contoh berikut mengelompokkan hasil menggunakan beberapa GROUP BY kriteria. Jika, dalam setiap OrderDateKey grup, ada subkelompok yang dapat dibingkai oleh DueDateKey, pengelompokan baru akan ditentukan 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 akan disertakan dalam hasilnya.

-- Uses AdventureWorks  
  
SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales   
FROM FactInternetSales  
GROUP BY OrderDateKey   
HAVING OrderDateKey > 20040000   
ORDER BY OrderDateKey;  

Lihat Juga

GROUPING_ID (T-SQL)
PENGELOMPOKAN (Transact-SQL)
SELECT (Transact-SQL)
Klausul SELECT (Transact-SQL)