Bir toplama işlevinde veya GROUP BY yan tümcesinde yer almadığından "Sütun seçim listesinde geçersizdir" Hatası nasıl düzeltilir?

Hata "Sütun, bir toplama işlevinde veya GROUP BY yan tümcesinde bulunmadığından, seçim listesinde geçersizdir"Aşağıda belirtilen", "GRUPLAMA"Sorgusu ve seçim listesine, ne grup maddesine göre grubun bir parçası olan ne de gibi bir toplama işlevinde bulunan en az bir sütun eklediniz. max (), min (), sum (), count () ve ort (). Bu nedenle, sorgunun çalışmasını sağlamak için, mümkünse ve sonuçlar üzerinde herhangi bir etkisi yoksa ya da bu sütunları uygun bir toplama işlevine dahil ederse, toplanmamış tüm sütunları her iki cümleye de eklememiz gerekir ve bu bir cazibe gibi çalışacaktır. Hata MS SQL'de ortaya çıkar, ancak MySQL'de değildir.

İki anahtar kelime "Gruplama ölçütü" ve "toplama işlevi"Bu hatada kullanılmıştır. Bu yüzden onları ne zaman ve nasıl kullanacağımızı anlamalıyız.

Maddeye göre gruplama:

Bir analistin SQL kullanarak kar, zarar, satış, maliyet ve maaş gibi verileri özetlemesi veya toplaması gerektiğinde, “GRUPLAMA”Bu konuda çok yardımcı oluyor. Örneğin özetlemek gerekirse, üst yönetime gösterilecek günlük satışlar. Benzer şekilde, bir üniversite grubundaki bir bölümdeki öğrenci sayısını toplama işlevi ile birlikte saymak istiyorsanız, bunu elde etmenize yardımcı olacaktır.

Böl-Uygula-Birleştir stratejisine göre gruplandırın:

"Böl-uygula-birleştir" stratejisine göre gruplama

Yukarıdaki şekilde, sütunun ilk sütun C1'e göre üç gruba ayrıldığını ve ardından gruplanmış değerlere toplama işlevinin uygulandığını görebiliriz. Son olarak birleştirme aşaması her gruba tek bir değer atar.

Bu, aşağıdaki örnek kullanılarak açıklanabilir. İlk olarak, "appuals" adlı bir veritabanı oluşturun.

Misal:

Tablo oluştur "işçi"Aşağıdaki kodu kullanarak.

[Appuals] KULLANIN GİT ANSI_NULLS GİT YÜRÜYÜŞ HALİNDE AYARLA QUOTED_IDENTIFIER AYARLA GO DEVAM EDİN ANSI_PADDING OLUŞTURMA TABLOSU [dbo]. [Çalışan] ([e_id] [int] NULL DEĞİL, [e_ename] [varchar] (50) NULL, [dep_id] [int] NULL, [maaş] [int] NULL, CONSTRAINT [PK_employee] BİRİNCİL ANAHTAR KÜMELENMİŞ ([e_id] ASC) (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_LOCKS) [ONOW_PAGE) PRIMARY]) ON [PRIMARY] SET ANSI_PADDING OFF GO

Şimdi, aşağıdaki kodu kullanarak tabloya veri ekleyin.

Çalışan (e_id, e_ename, dep_id, maaş) değerlerini (101, 'Sadia', 1,6000), (102, 'Saba', 1,5000), (103, 'Sana', 2,4000), ( 104, 'Hammad', 2,3000), (105, 'Umer', 3,4000), (106, 'Kanwal', 3,2000)

Çıktı şöyle olacak.

Şimdi aşağıdaki ifadeyi yürüterek tablodan veri seçin.

çalışandan * seçin

Çıktı şöyle olacak.

Şimdi tabloya göre bölüm kimliğine göre gruplayın.

dep_id, dep_id ile çalışan grubundan maaş seçin

Hata: Bir toplama işlevinde veya GROUP BY yan tümcesinde yer almadığından, 'employee.sallary' sütunu seçim listesinde geçersizdir.

Yukarıda bahsedilen hata, “GROUP BY” sorgusunun yürütülmesi ve seçim listesine gruba göre grubun parçası olmayan veya bir toplama işlevine dahil edilmeyen “çalışan.salary” sütununu dahil ettiğiniz için ortaya çıkar.

Çözüm:

Bildiğimiz gibi "Gruplama ölçütü" tek satır döndürün, bu nedenle bu hatayı önlemek için group by clause'da kullanılmayan sütunlara bir toplama işlevi uygulamamız gerekir. Son olarak, aşağıdaki kodu çalıştırarak her departmandaki çalışanın ortalama maaşını bulmak için group by ve bir toplama işlevi uygulayın.

dep_id ile çalışan grubundan ortalama_sallar olarak dep_id, avg (maaş) seçin

Ayrıca, bu tabloyu split_apply_combine yapısına göre tasvir edersek, şöyle görünecektir.

Yukarıdaki şekil, her şeyden önce tablonun departman kimliğine göre üç gruba ayrıldığını, ardından maaşın toplam ortalama değerini bulmak için toplam avg () işlevi uygulandığını ve daha sonra departman kimliği ile birleştirildiğini göstermektedir. Böylece tablo departman kimliğine göre gruplandırılır ve maaş departman bazında toplanır.

Toplama işlevleri:

Grup ve toplama işlevlerinin birlikte kullanımının mantıksal açıklaması:

Şimdi bir örnek aracılığıyla mantıksal olarak "gruplama ölçütü" ve "toplama işlevleri" nin kullanımını anlayacağız.

"insanlarAşağıdaki kodu kullanarak veritabanında ".

[Appuals] KULLANIN GO SET ANSI_NULLS GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo]. [Kişi] ([id] [bigint] IDENTITY (1,1) NOT NULL, [name] [varchar] (500) NULL, [ şehir] [varchar] (500) NULL, [durum] [varchar] (500) NULL, [yaş] [int] NULL) AÇIK [BİRİNCİL] GİT

Şimdi aşağıdaki sorguyu kullanarak tabloya veri ekleyin.

kişi (isim, şehir, eyalet, yaş) değerlerini ('Meggs', 'MONTEREY', 'CA', 20), ('Staton', 'HAYWARD', 'CA', 22), ('Ütüler', 'IRVINE', 'CA', 25) ('Krank', 'KEYİFLİ', 'IA', 23), ('Davidson', 'WEST BURLINGTON', 'IA', 40), ('Pepewachtel', 'FAIRFIELD ',' IA ', 35) (' Schmid ',' HILLSBORO ',' OR ', 23), (' Davidson ',' CLACKAMAS ',' OR ', 40), (' Condy ',' GRESHAM ',' VEYA ', 35)

Çıktı şöyle olacaktır:

Analistin farklı eyaletlerde ikamet edenlerin sayısını ve yaşlarını bilmesi gerekiyorsa. Aşağıdaki sorgu, gerekli sonuçları elde etmesine yardımcı olacaktır.

yaş seçin, eyalete göre kişi gruplarından no_of_residents olarak say (*)

Hata: "People.age" sütunu, bir toplama işlevinde veya GROUP BY yan tümcesinde yer almadığından, seçim listesinde geçersizdir.

Yukarıda belirtilen sorgunun yürütülmesinde aşağıdaki hatayla karşılaştık

"Msg 8120, Level 16, State 1, Line 16 Column" people.age ", bir toplama işlevinde veya GROUP BY yan tümcesinde yer almadığından seçim listesinde geçersizdir".

Bu hata, "GROUP BY" sorgu yürütüldü ve dahil ettiniz "'insanlar. yaş" group by cümlesinin parçası olmayan veya bir toplama işlevine dahil olmayan seçim listesindeki sütun.

Eyalete göre gruplama bir hata ortaya çıkarır

Mantıksal açıklama ve Çözüm:

Bu bir sözdizimi hatası değil, mantıksal bir hatadır. "No_of_residents" sütununun yalnızca tek bir satır döndürdüğünü görebildiğimiz gibi, şimdi tüm sakinlerin yaşını tek bir sütunda nasıl döndürebiliriz? Kişilerin yaşlarının virgülle veya ortalama yaş, minimum veya maksimum yaşla ayrılmış bir listesine sahip olabiliriz. Bu nedenle "yaş" sütunu hakkında daha fazla bilgiye ihtiyacımız var. Yaş sütunuyla ne demek istediğimizi ölçmeliyiz. Yaşa göre iade edilmesini istediğimiz şey. Şimdi sorumuzu bunun gibi yaş sütunu hakkında daha spesifik bilgilerle değiştirebiliriz.

Her eyalette ikamet edenlerin ortalama yaşı ile birlikte sakinleri bulun. Bunu göz önünde bulundurarak sorgumuzu aşağıda gösterildiği gibi değiştirmeliyiz.

eyalet seçin, yaş olarak ort (yaş), eyalete göre kişi gruplarından no_of_residents olarak say (*)

Bu hatasız yürütülecek ve çıktı böyle olacaktır.

Bu nedenle, select deyiminde neyin döndürüleceğini mantıklı bir şekilde düşünmek de çok önemlidir.

Ayrıca, aşağıdaki noktalar göz önünde bulundurulmalıdır. hataları önlemek için "gruplama ölçütü" nü kullanma.

Gruplama ölçütü ve NULL değerleri:

Önce, "durum" sütunu boş / boş olacak şekilde "insanlar" adlı tabloya başka bir satır ekleyin.

kişilere (ad, şehir, eyalet, yaş) değerleri ekleyin ('Kanwal', 'GRESHAM', '', 35)

Şimdi aşağıdaki ifadeyi yürütün.

eyalet seçin, yaş olarak ort (yaş), eyalete göre kişi gruplarından no_of_residents olarak say (*)

Aşağıdaki şekil çıktısını göstermektedir. Durum sütunundaki boş değerin ayrı bir grup olarak kabul edildiğini görebilirsiniz.

Şimdi, durum olarak null değerine sahip tabloya daha fazla satır ekleyerek boş satırları artırmayın.

kişilere (ad, şehir, eyalet, yaş) değerleri ekleyin ('Kanwal', 'IRVINE', 'NULL', 35), ('Krank', 'PLEASANT', 'NULL', 23)

Şimdi çıktıyı seçmek için aynı sorguyu tekrar çalıştırın. Sonuç kümesi şöyle olacak.

Bu şekilde, boş bir sütunun ayrı bir grup olarak değerlendirildiğini ve 2 satırlı boş sütunun iki yerleşik olmayan başka bir ayrı grup olarak kabul edildiğini görebiliyoruz. "Grupla" bu şekilde çalışır.

Facebook Twitter Google Plus Pinterest