Hoe de fout te herstellen ‘Kolom is ongeldig in de selectielijst omdat deze niet is opgenomen in een verzamelfunctie of de GROUP BY-clausule’
De fout "Kolom is ongeldig in de selectielijst omdat deze niet is opgenomen in een aggregatiefunctie of de GROUP BY-clausule"Hieronder vermeld verschijnt wanneer u"GROEP OP”-query, en u hebt ten minste één kolom in de selectielijst opgenomen die geen deel uitmaakt van de group by-clausule en ook niet is opgenomen in een aggregatiefunctie zoals max (), min (), sum (), count () en gem. (). Dus om de query te laten werken, moeten we alle niet-geaggregeerde kolommen toevoegen aan een van beide groepen op clausules, indien mogelijk en dit heeft geen enkele invloed op de resultaten, of nemen deze kolommen op in een geschikte geaggregeerde functie, en dit zal als een charme werken. De fout doet zich voor in MS SQL maar niet in MySQL.
Twee trefwoorden 'Groeperen op” en “geaggregeerde functie”Zijn gebruikt in deze fout. We moeten dus begrijpen wanneer en hoe we ze moeten gebruiken.
Groeperen op clausule:
Wanneer een analist de gegevens zoals winst, verlies, omzet, kosten en salaris, enz. Moet samenvatten of aggregeren met behulp van SQL, "GROEP OP”Is daarbij erg behulpzaam. Om samen te vatten, dagelijkse verkopen om aan het senior management te laten zien. Evenzo, als u het aantal studenten op een afdeling in een universitaire groep wilt tellen, samen met de geaggregeerde functie, kunt u dit bereiken.
Groeperen op Split-Apply-Combine-strategie:
Groeperen op maakt gebruik van de "split-apply-combi" -strategie
In de bovenstaande afbeelding kunnen we zien dat de kolom is opgesplitst in drie groepen op basis van de eerste kolom C1, en vervolgens wordt de aggregatiefunctie toegepast op gegroepeerde waarden. Eindelijk kent de combinatiefase een enkele waarde toe aan elke groep.
Dit kan worden uitgelegd aan de hand van het onderstaande voorbeeld. Maak eerst een database met de naam "appuals".
Voorbeeld:
Maak een tafel 'werknemer”Met de volgende code.
GEBRUIK [appuals] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo]. [Medewerker] ([e_id] [int] NOT NULL, [e_ename] [varchar] (50) NULL, [dep_id] [int] NULL, [salaris] [int] NULL, CONSTRAINT [PK_employee] PRIMAIRE SLEUTEL GECLUSTERD ([e_id] ASC) MET (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) PRIMAIR]) AAN [PRIMAIR] GO SET ANSI_PADDING UIT GO
Voeg nu gegevens in de tabel in met de volgende code.
Invoegen in werknemer (e_id, e_ename, dep_id, salaris) waarden (101, 'Sadia', 1.6000), (102, 'Saba', 1.5000), (103, 'Sana', 2.4000), ( 104, 'Hammad', 2,3000), (105, 'Umer', 3,4000), (106, 'Kanwal', 3,2000)
De uitvoer zal als volgt zijn.
Selecteer nu gegevens uit de tabel door de volgende instructie uit te voeren.
selecteer * van werknemer
De output zal als volgt zijn.
Groepeer nu bij de tafel op afdelings-ID.
selecteer dep_id, salaris van werknemersgroep door dep_id
Fout: de kolom ’werknemer.sallary’ is ongeldig in de selectielijst omdat deze niet is opgenomen in een verzamelfunctie of de GROUP BY-clausule.
De hierboven vermelde fout doet zich voor omdat de "GROUP BY" -query wordt uitgevoerd en u de kolom "employee.salary" hebt opgenomen in de selectielijst die geen deel uitmaakt van de group by-clausule en ook niet is opgenomen in een geaggregeerde functie.
Oplossing:
Zoals we dat weten "Groeperen op" retourneer enkele rij, dus we moeten een aggregatiefunctie toepassen op kolommen die niet in de group by-clausule worden gebruikt om deze fout te voorkomen. Pas tenslotte groeperen op en een geaggregeerde functie toe om het gemiddelde salaris van de werknemer op elke afdeling te vinden door de volgende code uit te voeren.
selecteer dep_id, avg (salaris) als gemiddelde_salaris van werknemersgroep door dep_id
Bovendien, als we deze tabel weergeven volgens de split_apply_combine-structuur, zal het er zo uitzien.
De bovenstaande afbeelding laat zien dat de tabel eerst in drie groepen is gegroepeerd op afdelings-ID, waarna de functie geaggregeerde avg() wordt toegepast om de totale gemiddelde waarde van het salaris te vinden, die vervolgens wordt gecombineerd met afdelings-ID. De tabel is dus gegroepeerd op afdelings-ID en het salaris wordt per afdeling geaggregeerd.
Geaggregeerde functies:
De logische beschrijving van het gebruik van group by en geaggregeerde functies samen:
Nu zullen we het gebruik van "groeperen op" en "geaggregeerde functies" logisch begrijpen aan de hand van een voorbeeld.
Maak een tabel met de naam 'mensen”In de database door de volgende code te gebruiken.
GEBRUIK [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, [ stad] [varchar] (500) NULL, [staat] [varchar] (500) NULL, [leeftijd] [int] NULL) OP [PRIMAIR] GAAN
Voeg nu gegevens in de tabel in met behulp van de volgende query.
invoegen in personen (naam, stad, staat, leeftijd) waarden ('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 ',' OF ', 35)
De output zal zijn als:
Als de analist geen inwoners en hun leeftijd in de verschillende staten wil weten. De volgende vraag zal hem helpen bij het verkrijgen van de vereiste resultaten.
selecteer leeftijd, aantal(*) als no_of_residents van mensen groeperen per staat
Fout: De kolom ‘people.age’ is ongeldig in de keuzelijst omdat deze niet is opgenomen in een verzamelfunctie of de GROUP BY-clausule.
Bij het uitvoeren van de bovengenoemde query, kwamen we de volgende fout tegen
"Msg 8120, niveau 16, staat 1, regel 16 Kolom‘ people.age ’is ongeldig in de keuzelijst omdat het niet is opgenomen in een verzamelfunctie of de GROUP BY-clausule”.
Deze fout treedt op omdat de "GROUP BY" query wordt uitgevoerd en u hebt opgenomen "'mensen. leeftijd" kolom in de selectielijst die geen deel uitmaakt van de group by-clausule en ook niet is opgenomen in een geaggregeerde functie.
Bij het groeperen op staat treedt een fout op
Logische beschrijving en oplossing:
Dit is geen syntaxisfout, maar het is een logische fout. Aangezien we kunnen zien dat de kolom "no_of_residents" slechts één rij retourneert, hoe kunnen we nu de leeftijd van alle bewoners in een enkele kolom teruggeven? We kunnen een lijst hebben met de leeftijd van mensen gescheiden door komma's of de gemiddelde leeftijd, minimum- of maximumleeftijd. We hebben dus meer informatie nodig over de kolom “leeftijd”. We moeten kwantificeren wat we bedoelen met de leeftijdskolom. Op leeftijd willen we teruggegeven worden. Nu kunnen we onze vraag wijzigen met meer specifieke informatie over de leeftijdskolom zoals deze.
Vind het aantal inwoners samen met de gemiddelde leeftijd van de inwoners in elke staat. Gezien dit moeten we onze vraag aanpassen zoals hieronder weergegeven.
selecteer staat, avg (leeftijd) als Leeftijd, tel (*) als aantal_bewoners van de groep mensen per staat
Dit zal zonder fouten worden uitgevoerd en de uitvoer zal als volgt zijn.
Het is dus ook cruciaal om logisch na te denken over wat u in de select-instructie wilt retourneren.
Bovendien moeten de volgende punten in gedachten worden gehouden terwijl gebruik de "groeperen op" om fouten te voorkomen.
Groeperen op en NULL-waarden:
Voeg eerst nog een rij toe aan de tabel met de naam "people" met de "state" -kolom als leeg / null.
invoegen in personen (naam, stad, staat, leeftijd) waarden ('Kanwal', 'GRESHAM', '', 35)
Voer nu de volgende instructie uit.
selecteer staat, avg (leeftijd) als Leeftijd, tel (*) als aantal_bewoners van de groep mensen per staat
De volgende afbeelding toont de output. U kunt zien dat de lege waarde in de statuskolom als een aparte groep wordt beschouwd.
Verhoog nu geen null-rijen door meer rijen in de tabel in te voegen met null als staat.
invoegen in personen (naam, stad, staat, leeftijd) waarden ('Kanwal', 'IRVINE', 'NULL', 35), ('Krank', 'PLEASANT', 'NULL', 23)
Voer nu opnieuw dezelfde query uit om uitvoer te selecteren. De resultaatset zal er zo uitzien.
We kunnen in deze figuur zien dat een lege kolom wordt beschouwd als een aparte groep en de nulkolom met 2 rijen wordt beschouwd als een andere aparte groep met twee aantal inwoners. Dit is hoe "groeperen op" werkt.