Cách sửa lỗi "Cột không hợp lệ trong danh sách chọn vì nó không có trong hàm tổng hợp hoặc mệnh đề GROUP BY"
Lỗi "Cột không hợp lệ trong danh sách chọn vì nó không có trong hàm tổng hợp hoặc mệnh đề GROUP BY"Được đề cập bên dưới phát sinh khi bạn thực thi"NHÓM THEO”Và bạn đã bao gồm ít nhất một cột trong danh sách lựa chọn mà không phải là một phần của nhóm theo mệnh đề cũng như không được chứa trong một hàm tổng hợp như max (), min (), sum (), count () và trung bình (). Vì vậy, để truy vấn hoạt động, chúng ta cần thêm tất cả các cột không được tổng hợp vào một trong hai nhóm theo mệnh đề nếu khả thi và không có bất kỳ tác động nào đến kết quả hoặc bao gồm các cột này trong một hàm tổng hợp phù hợp và điều này sẽ hoạt động giống như một sự quyến rũ. Lỗi phát sinh trong MS SQL nhưng không phải trong MySQL.
Hai từ khóa “Nhóm theo”Và“chức năng tổng hợp”Đã được sử dụng trong lỗi này. Vì vậy, chúng ta phải hiểu khi nào và làm thế nào để sử dụng chúng.
Nhóm theo mệnh đề:
Khi một nhà phân tích cần tóm tắt hoặc tổng hợp dữ liệu như lãi, lỗ, doanh số, chi phí và tiền lương, v.v. bằng cách sử dụng SQL, “NHÓM THEO”Rất hữu ích trong vấn đề này. Ví dụ, để tổng hợp, doanh số hàng ngày để hiển thị cho quản lý cấp cao. Tương tự, nếu bạn muốn đếm số lượng sinh viên trong một khoa trong một nhóm trường đại học cùng với hàm tổng hợp sẽ giúp bạn đạt được điều này.
Nhóm theo chiến lược Chia nhỏ-Áp dụng-Kết hợp:
Nhóm bằng cách sử dụng chiến lược "tách-áp-dụng-kết hợp"
Trong hình trên, chúng ta có thể thấy rằng cột đã được chia thành ba nhóm dựa trên cột đầu tiên C1, và sau đó hàm tổng hợp được áp dụng trên các giá trị được nhóm. Ở pha kết hợp cuối cùng chỉ định một giá trị duy nhất cho mỗi nhóm.
Điều này có thể được giải thích bằng cách sử dụng ví dụ dưới đây. Đầu tiên, tạo một cơ sở dữ liệu có tên là “appuals”.
Thí dụ:
Tạo bảng “Nhân viên”Bằng cách sử dụng mã sau.
SỬ DỤNG [appuals] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo]. [Worker] ([e_id] [int] NOT NULL, [e_ename] [varchar] (50) NULL, [dep_id] [int] NULL, [lương] [int] NULL, CONSTRAINT [PK_employee] ĐÃ ĐIỀU CHỈNH TỪ KHÓA CHÍNH QUYỀN ([e_id] ASC) VỚI (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLKS = ONPAGE_LOCKS = ON, ALLKS = ONPAGE_LOCKS = ON CHÍNH]) BẬT [CHÍNH] ĐI ĐẶT ANSI_PADDING TẮT ĐI
Bây giờ, Chèn dữ liệu vào bảng bằng đoạn mã sau.
Chèn vào các giá trị của nhân viên (e_id, e_ename, dep_id, lương) (101, 'Sadia', 1,6000), (102, 'Saba', 1,5000), (103, 'Sana', 2,4000), ( 104, 'Hammad', 2.3000), (105, 'Umer', 3.4000), (106, 'Kanwal', 3.2000)
Đầu ra sẽ như thế này.
Bây giờ chọn dữ liệu từ bảng bằng cách thực hiện câu lệnh sau.
chọn * từ nhân viên
Đầu ra sẽ như thế này.
Bây giờ nhóm theo bảng theo id bộ phận.
chọn dep_id, lương từ nhóm nhân viên theo dep_id
Lỗi: Cột 'worker.sallary' không hợp lệ trong danh sách chọn vì nó không có trong hàm tổng hợp hoặc mệnh đề GROUP BY.
Lỗi được đề cập ở trên phát sinh do truy vấn “GROUP BY” được thực thi và bạn đã đưa cột “worker.salary” vào danh sách chọn, cột này không thuộc nhóm theo mệnh đề cũng như không được bao gồm trong một hàm tổng hợp.
Giải pháp:
Như chúng ta biết rằng "Nhóm theo" trả về hàng đơn, vì vậy chúng ta cần áp dụng hàm tổng hợp cho các cột không được sử dụng trong mệnh đề nhóm để tránh lỗi này. Cuối cùng, áp dụng nhóm theo và một hàm tổng hợp để tìm mức lương trung bình của nhân viên trong từng bộ phận bằng cách thực hiện đoạn mã sau.
chọn dep_id, avg (lương) là average_sallary từ nhóm nhân viên theo dep_id
Hơn nữa, nếu chúng ta mô tả bảng này theo cấu trúc split_apply_combine, nó sẽ trông như thế này.
Hình trên cho thấy trước hết, bảng được nhóm thành ba nhóm theo id bộ phận, sau đó hàm tổng hợp avg () được áp dụng để tìm giá trị trung bình tổng hợp của tiền lương, sau đó được kết hợp với id bộ phận. Do đó, bảng được nhóm theo id bộ phận và tiền lương được tổng hợp theo bộ phận khôn ngoan.
Chức năng tổng hợp:
Mô tả hợp lý về việc sử dụng nhóm theo và tổng hợp các chức năng lại với nhau:
Bây giờ chúng ta sẽ hiểu việc sử dụng “nhóm theo” và “hàm tổng hợp” một cách hợp lý thông qua một ví dụ.
Tạo một bảng có tên “Mọi người”Trong cơ sở dữ liệu bằng cách sử dụng mã sau.
SỬ DỤNG [appuals] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo]. [People] ([id] [bigint] IDENTITY (1,1) NOT NULL, [name] [varchar] (500) NULL, [ city] [varchar] (500) NULL, [state] [varchar] (500) NULL, [age] [int] NULL) ON [PRIMARY] GO
Bây giờ hãy chèn dữ liệu vào bảng bằng cách sử dụng truy vấn sau.
chèn vào người (tên, thành phố, tiểu bang, tuổi) các giá trị ('Meggs', 'MONTEREY', 'CA', 20), ('Staton', 'HAYWARD', 'CA', 22), ('Irons', 'IRVINE', 'CA', 25) ('Krank', 'PLEASANT', 'IA', 23), ('Davidson', 'WEST BURLINGTON', 'IA', 40), ('Pepewachtel', 'FAIRFIELD ',' IA ', 35) (' Schmid ',' HILLSBORO ',' OR ', 23), (' Davidson ',' CLACKAMAS ',' OR ', 40), (' Condy ',' GRESHAM ',' HOẶC ', 35)
Kết quả đầu ra sẽ như sau:
Nếu nhà phân tích cần biết không có cư dân và độ tuổi của họ ở các tiểu bang khác nhau. Truy vấn sau đây sẽ giúp anh ta nhận được kết quả cần thiết.
chọn độ tuổi, đếm (*) là no_of_resident từ nhóm người theo tiểu bang
Lỗi: Cột ‘people.age’ không hợp lệ trong danh sách chọn vì nó không có trong hàm tổng hợp hoặc mệnh đề GROUP BY.
Khi thực hiện truy vấn đề cập ở trên, chúng tôi đã gặp lỗi sau
“Msg 8120, Mức 16, Trạng thái 1, Dòng 16 Cột‘ people.age ’không hợp lệ trong danh sách chọn vì nó không có trong hàm tổng hợp hoặc mệnh đề GROUP BY”.
Lỗi này phát sinh bởi vì “NHÓM THEO” truy vấn được thực thi và bạn đã bao gồm "'Mọi người. tuổi tác" trong danh sách chọn không phải là một phần của nhóm theo mệnh đề cũng như không được bao gồm trong một hàm tổng hợp.
Phân nhóm theo trạng thái phát sinh lỗi
Mô tả logic và Giải pháp:
Đây không phải là lỗi cú pháp mà là lỗi logic. Như chúng ta có thể thấy rằng cột “no_of_resident” chỉ trả về một hàng duy nhất, bây giờ làm cách nào chúng ta có thể trả về tuổi của tất cả cư dân trong một cột? Chúng ta có thể có danh sách tuổi của những người được phân tách bằng dấu phẩy hoặc tuổi trung bình, tuổi tối thiểu hoặc tuổi tối đa. Vì vậy, chúng tôi cần thêm thông tin về cột "tuổi". Chúng ta phải định lượng ý nghĩa của chúng ta bằng cột tuổi. Theo độ tuổi những gì chúng ta muốn được trả lại. Bây giờ chúng ta có thể thay đổi câu hỏi của mình với thông tin cụ thể hơn về cột tuổi như thế này.
Tìm không có cư dân nào cùng với độ tuổi trung bình của cư dân ở mỗi tiểu bang. Xem xét điều này, chúng tôi phải sửa đổi truy vấn của mình như được hiển thị bên dưới.
chọn tiểu bang, trung bình (tuổi) là Tuổi, đếm (*) là không có_người cư trú từ nhóm người theo tiểu bang
Điều này sẽ thực thi mà không có lỗi và đầu ra sẽ như thế này.
Vì vậy, điều quan trọng là phải suy nghĩ một cách logic về những gì sẽ trả lại trong câu lệnh select.
Hơn nữa, những điểm sau đây cần được lưu ý trong khi sử dụng "nhóm theo" để tránh lỗi.
Nhóm theo và giá trị NULL:
Đầu tiên, thêm một hàng khác vào bảng có tên “people” với cột “state” là trống / null.
chèn vào giá trị người (tên, thành phố, tiểu bang, tuổi) ('Kanwal', 'GRESHAM', '', 35)
Bây giờ thực hiện câu lệnh sau.
chọn tiểu bang, trung bình (tuổi) là Tuổi, đếm (*) là không có_người cư trú từ nhóm người theo tiểu bang
Hình sau đây cho thấy sản lượng của nó. Bạn có thể thấy giá trị trống trong cột trạng thái được coi là một nhóm riêng biệt.
Bây giờ tăng không có hàng null nào bằng cách chèn thêm hàng vào bảng với trạng thái là null.
chèn vào các giá trị của người (tên, thành phố, tiểu bang, tuổi) ('Kanwal', 'IRVINE', 'NULL', 35), ('Krank', 'PLEASANT', 'NULL', 23)
Bây giờ một lần nữa thực hiện cùng một truy vấn để chọn đầu ra. Tập hợp kết quả sẽ như thế này.
Chúng ta có thể thấy trong hình này rằng một cột trống được coi là một nhóm riêng biệt và cột rỗng có 2 hàng được coi là một nhóm riêng biệt khác với hai không có cư dân. Đây là cách "nhóm theo" hoạt động.