Bagikan melalui


SELECT - klausa GROUP BY (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistem Platform Analitik (PDW)Titik akhir analitik SQL di Microsoft FabricGudang di Microsoft FabricDatabase 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 per grup.

Syntax

Konvensi sintaks transact-SQL

Sintaks untuk SQL Server dan 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 }
       }

Sintaks untuk Azure Synapse Analytics:

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

Sintaks untuk Analytics Platform System (PDW):

GROUP BY {
      column-name [ WITH (DISTRIBUTED_AGG) ]
    | column-expression
} [ , ...n ]

Arguments

column-expression

Menentukan kolom atau perhitungan non-agregat 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, setiap tabel atau kolom tampilan dalam ekspresi nonaggregate apa pun dalam <select> daftar harus disertakan dalam GROUP BY daftar.

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 Anda tentukan dalam SELECT daftar. Ini dapat menggunakan alias kolom untuk tabel turunan yang ditentukan dalam FROM klausa.
  • 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(). Aturan ini juga berlaku untuk ekspresi dalam HAVING klausa.
  • 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.
  • Sebuah subquery. Kesalahan 144 dikembalikan.
  • Kolom dari tampilan terindeks.

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

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 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 (Ini adalah total keseluruhan)

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

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

Hasil kueri memiliki agregasi yang sama dengan yang sederhana 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.

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 dan Azure SQL Database

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.

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:

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

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

Berlaku untuk: SQL Server dan Azure SQL Database

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)

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

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

Note

DISTRIBUTED_AGG Petunjuk kueri disediakan untuk kompatibilitas mundur dengan versi Analytics Platform System (PDW) sebelumnya dan tidak meningkatkan performa 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 SELECT daftar, GROUP BY menghitung nilai ringkasan untuk setiap grup. Fungsi-fungsi ini dikenal sebagai agregat vektor.
  • Agregat yang berbeda. Agregat AVG(DISTINCT <column_name>), , COUNT(DISTINCT <column_name>)dan SUM(DISTINCT <column_name>) bekerja dengan ROLLUP, , CUBEdan GROUPING SETS.

WHERE Klausul:

  • SQL menghapus baris yang tidak memenuhi kondisi dalam WHERE klausa sebelum melakukan operasi pengelompokan apa pun.

HAVING Klausul:

  • SQL menggunakan klausul HAVING untuk memfilter grup dalam tataan hasil.

ORDER BY Klausul:

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

nilai NULL:

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

Keterbatasan

Berlaku untuk: SQL Server dan Azure Synapse Analytics

Kapasitas maksimum

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 CUBE
    

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

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 BY klausul kecuali merupakan bagian dari daftar eksplisit GROUPING SETS . 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. Klausa ini secara semantik setara dengan contoh sebelumnya GROUP BY . Pembatasan ini menghindari kemungkinan yang 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 pertama GROUP BY dan memiliki sintaks yang lebih jelas.

  • GROUP BY ALL dan GROUP BY DISTINCT hanya diizinkan dalam klausa sederhana GROUP BY yang berisi ekspresi kolom. Anda tidak dapat menggunakannya dengan GROUPING SETSkonstruksi , , ROLLUPCUBE, WITH CUBE, atau WITH ROLLUP . ALL adalah default dan implisit. Ini juga hanya diizinkan dalam sintaksis yang kompatibel mundur.

Perbandingan fitur yang didukung GROUP BY

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

Feature SQL Server Integration Services (SSIS) Tingkat kompatibilitas SQL Server 100 atau lebih tinggi
DISTINCT Agregat Tidak didukung untuk WITH CUBE atau WITH ROLLUP. Didukung untuk WITH CUBE, , GROUPING SETSWITH ROLLUP, 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);

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);
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

Examples

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 and Analytics Platform System (PDW)

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, 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;