Làm thế nào để chọn nhiều cột nhưng chỉ nhóm theo một?


14

Tôi có một vấn đề với group by, tôi muốn chọn nhiều cột nhưng chỉ nhóm một cột. Truy vấn dưới đây là những gì tôi đã thử, nhưng nó đã cho tôi một lỗi.

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;

Câu trả lời:


19

Trong SQL Server, bạn chỉ có thể chọn các cột là một phần của GROUP BYmệnh đề hoặc các hàm tổng hợp trên bất kỳ cột nào khác. Tôi đã viết về điều này chi tiết ở đây . Vì vậy, bạn có hai lựa chọn:

  1. Thêm các cột bổ sung vào GROUP BYmệnh đề:

    GROUP BY Rls.RoleName, Pro.[FirstName], Pro.[LastName]
  2. Thêm một số hàm tổng hợp trên các cột có liên quan:

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

Giải pháp thứ hai chủ yếu là một cách giải quyết và một dấu hiệu cho thấy bạn nên sửa một cái gì đó chung chung hơn với truy vấn của mình.


"Trong SQL Server, bạn chỉ có thể chọn các cột là một phần của mệnh đề GROUP BY hoặc các hàm tổng hợp trên bất kỳ cột nào khác ..." là thứ tôi đang tìm kiếm .. Thnx
Irfan

LƯU Ý: hai tùy chọn này có thể cung cấp kết quả hoàn toàn SAI! GROUP BY A,B,Ccó thể hoàn toàn khác với những gì bạn muốn nhận được so với GROUP BY A. và ngoài ra, thông thường chúng ta không thể sử dụng một số hàm tổng hợp để nhận giá trị cột liên quan. kiểm tra câu trả lời này như một giải pháp
S.Serpooshan

2

Lưu ý: Câu trả lời này nhằm mục đích bổ sung cho câu trả lời của @Lukas Eder

Nếu có nhiều giá trị hiện diện cho các trường SELECTed nhưng một trường bạn muốn GROUP BY, thay vào đó, bạn có thể lấy dòng khớp trên cùng, thay vì chờ kết hợp ( MAX) trở lại.

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

nếu bạn muốn TẤT CẢ các giá trị trả về trong các cột khác, nhưng muốn thu gọn nó thành một mục duy nhất, hãy xem: https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in -transact-sql /

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.