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 untuk setiap grup.

Syntax

Konvensi sintaks transact-SQL

Sintaksis yang mematuhi ISO untuk SQL Server dan Azure SQL Database:

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 mematuhi ISO untuk SQL Server dan Azure SQL Database (hanya 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 Analytics Platform System (PDW):

GROUP BY {
      column-name [ WITH (DISTRIBUTED_AGG) ]
    | column-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 mirip UNION ALL dengan beberapa GROUP BY kueri tetapi dioptimalkan bersama-sama.

  • () (set pengelompokan kosong)

    Singkatan untuk menghitung hanya total keseluruhan di semua baris. Gunakan sendiri sebagai GROUP BY () atau di dalam GROUPING 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 atau GROUP BY ROLLUP(...). Didukung hanya untuk kompatibilitas mundur. Gunakan subklaus ISO jika memungkinkan.

  • WITH (DISTRIBUTED_AGG)

    Petunjuk eksekusi terdistribusi untuk agregasi saat mengelompokkan menurut satu kolom. Kumpulan SQL khusus Azure Synapse Analytics dan Analytics Platform System (PDW) adalah satu-satunya platform 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 di GROUP BY 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. Kueri mengembalikan kesalahan 144.
  • 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;

GROUP BY 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 NULL nilai 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 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) dapat 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.

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.

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 ALL dan GROUP BY DISTINCT dalam klausa dasar GROUP BY yang berisi ekspresi kolom. Anda tidak dapat menggunakannya dengan GROUPING SETSkonstruksi , , ROLLUPCUBE, WITH CUBE, atau WITH ROLLUP . ALL adalah default dan implisit. Anda hanya dapat menggunakannya dalam sintaksis kompatibel mundur.

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. 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 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, Mesin Database memperlakukan semua NULL nilai 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 CUBE
    

    Untuk klausa kompatibel GROUP BY mundur yang tidak berisi CUBE atau ROLLUP, GROUP BY ukuran kolom, kolom agregat, dan nilai agregat yang terlibat dalam kueri membatasi jumlah GROUP BY item. Batas ini berasal dari batas 8.060 byte pada worktable perantara yang menyimpan hasil kueri perantara. Anda dapat menggunakan maksimum 12 ekspresi pengelompokan saat Menentukan CUBE atau ROLLUP.

Perbandingan fitur GROUP BY yang didukung

Tabel berikut ini menjelaskan GROUP BY fitur yang didukung produk yang berbeda.

Feature SQL Server Integration Services (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

Sampel kode dalam artikel ini menggunakan database sampel AdventureWorks2025 atau AdventureWorksDW2025, yang dapat Anda unduh dari halaman beranda Sampel dan Proyek Komunitas Microsoft SQL Server.

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