Bagaimana cara memilih beberapa kolom tetapi hanya mengelompokkan satu per satu?

14

Saya memiliki masalah dengan group by, saya ingin memilih beberapa kolom tetapi dikelompokkan hanya dengan satu kolom. Kueri di bawah ini adalah apa yang saya coba, tetapi itu memberi saya kesalahan.

SELECT Rls.RoleName,Pro.[FirstName],Pro.[LastName],Count(UR.[RoleId]) as [Count]
from [b.website-sitecore-core].[dbo].[aspnet_UsersInRoles] UR
inner join [b.website-professional-au].[dbo].[Profile]  Pro
on UR.UserId = Pro.Id
inner join [b.website-sitecore-core].[dbo].[aspnet_Roles] Rls
on Rls.RoleId = UR.RoleId
inner join [b.website-professional-au].[dbo].[Gender] Gn
on gn.Id = pro.GenderId
GROUP BY Rls.RoleName;
Nayeem Mansoori
sumber

Jawaban:

19

Dalam SQL Server Anda hanya bisa memilih kolom yang merupakan bagian dari GROUP BYklausa, atau fungsi agregat di salah satu kolom lainnya. Saya sudah membuat blog tentang hal ini secara rinci di sini . Jadi, Anda memiliki dua opsi:

  1. Tambahkan kolom tambahan ke GROUP BYklausa:

    GROUP BY Rls.RoleName, Pro.[FirstName], Pro.[LastName]
  2. Tambahkan beberapa fungsi agregat pada kolom yang relevan:

    SELECT Rls.RoleName, MAX(Pro.[FirstName]), MAX(Pro.[LastName])

Solusi kedua sebagian besar merupakan solusi dan indikasi bahwa Anda harus memperbaiki sesuatu yang lebih umum dengan permintaan Anda.

Lukas Eder
sumber
"Dalam SQL Server, Anda hanya dapat memilih kolom yang merupakan bagian dari klausa GROUP BY, atau fungsi agregat di salah satu kolom lainnya ..." adalah sesuatu yang saya cari .. Thnx
Irfan
CATATAN: kedua opsi ini dapat memberikan hasil yang SALAH! GROUP BY A,B,Cbisa sangat berbeda dari apa yang ingin Anda dapatkan sebagai perbandingan GROUP BY A. dan juga, biasanya kita tidak dapat menggunakan beberapa fungsi agregat untuk mendapatkan nilai kolom terkait. periksa jawaban ini sebagai solusi
S.Serpooshan
2

Catatan: Jawaban ini dimaksudkan sebagai pelengkap dari jawaban @Lukas Eder

Jika ada beberapa nilai yang ada untuk bidang, SELECTtetapi bidang yang Anda inginkan GROUP BY, Anda bisa mengambil garis pencocokan teratas, daripada menunggu agregasi ( MAX) untuk kembali.

SELECT i.RoleName, i.*
FROM Rls JOIN 
(SELECT TOP 1 R.Rolename, Pro.FirstName, Pro.LastName FROM Rls as R JOIN Pro ON ... ) as i
     ON i.Rolename=Rls.RoleName

jika Anda ingin SEMUA nilai dikembalikan di kolom lain itu, tetapi ingin menciutkannya menjadi satu entri, lihat: https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in -transact-sql /

mpag
sumber