Hur man åtgärdar felet ”Kolumn är ogiltig i listan eftersom den inte finns i en aggregerad funktion eller GROUP BY-klausulen”

Felet "Kolumnen är ogiltig i listan eftersom den inte ingår i en aggregerad funktion eller GROUP BY-satsen”Som nämns nedan uppstår när du kör“GRUPP AV”-Frågan, och du har inkluderat minst en kolumn i listan som varken är en del av gruppen efter klausul eller ingår i en sammanlagd funktion som max (), min (), sum (), count () och genomsnitt (). Så för att frågan ska fungera måste vi lägga till alla icke-aggregerade kolumner i endera gruppen efter klausul om det är möjligt och inte har någon inverkan på resultaten eller inkludera dessa kolumner i en lämplig sammanlagd funktion, och detta kommer att fungera som en charm. Felet uppstår i MS SQL men inte i MySQL.

Två nyckelord “Grupp av”Och”aggregerad funktion”Har använts i detta fel. Så vi måste förstå när och hur vi använder dem.

Gruppera efter klausul:

När en analytiker behöver sammanfatta eller sammanställa data som vinst, förlust, försäljning, kostnad och lön etc. med hjälp av SQL, “GRUPP AV”Är till stor hjälp i detta avseende. Till exempel för att sammanfatta, daglig försäljning för att visa för ledningen. På samma sätt, om du vill räkna antalet studenter i en institution i en universitetsgrupp tillsammans med aggregerad funktion hjälper det dig att uppnå detta.

Gruppera efter Split-Apply-Combine-strategi:

Gruppera efter strategin "split-applicera-kombinera"

I figuren ovan kan vi se att kolumnen har delats in i tre grupper baserat på första kolumn C1, och sedan tillämpas aggregerad funktion på grupperade värden. Äntligen tilldelar kombinationsfasen ett enda värde till varje grupp.

Detta kan förklaras med hjälp av exemplet nedan. Skapa först en databas med namnet "appuals".

Exempel:

Skapa en tabell “anställd”Med följande kod.

ANVÄND [appuals] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo]. [Medarbetare] ([e_id] [int] NOT NULL, [e_ename] [varchar] (50) NULL, [dep_id] [int] NULL, [lön] [int] NULL, CONSTRAINT [PK_medarbetare] PRIMÄR KEY CLUSTERED ([e_id] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON_ PRIMÄR]) PÅ [PRIMÄR] GO STÄLL ANSI_PADDING AV GO

Sätt nu in data i tabellen med följande kod.

Infoga i anställdes (e_id, e_ename, dep_id, lön) värden (101, 'Sadia', 1600), (102, 'Saba', 15000), (103, 'Sana', 24000), ( 104, 'Hammad', 2.3000), (105, 'Umer', 3.4000), (106, 'Kanwal', 3.2000)

Resultatet blir så här.

Välj nu data från tabellen genom att utföra följande uttalande.

välj * från anställd

Resultatet blir så här.

Gruppera nu efter tabellen enligt avdelnings-id.

välj dep_id, lön från anställdsgrupp efter dep_id

Fel: Kolumn 'medarbetare.sallary' är ogiltig i listan eftersom den inte finns i en aggregerad funktion eller GROUP BY-satsen.

Felet som nämns ovan uppstår eftersom ”GROUP BY” -frågan körs och du har inkluderat kolumnen “medarbetare.lön” i vallistan som varken är en del av gruppen efter klausul eller ingår i en samlad funktion.

Lösning:

Som vi vet det "Grupp av" returnera en rad, så vi måste använda en aggregerad funktion på kolumner som inte används i grupp efter klausul för att undvika detta fel. Slutligen, använd grupp efter och en sammanlagd funktion för att hitta den genomsnittliga lönen för den anställde i varje avdelning genom att utföra följande kod.

välj dep_id, genomsnitt (lön) som genomsnittlig_sallary från anställdsgrupp efter dep_id

Dessutom, om vi visar denna tabell enligt split_apply_combine-strukturen kommer den att se ut så här.

Bilden ovan visar att tabellen först och främst är grupperad i tre grupper enligt avdelnings-id, sedan tillämpas aggregerad avg () -funktion för att hitta aggregerat medelvärde för lön, som sedan kombineras med avdelnings-id. Således grupperas tabellen efter avdelnings-id och lönen är aggregerad avdelningsvis.

Aggregerade funktioner:

Den logiska beskrivningen av användningen av grupp efter och aggregerade funktioner tillsammans:

Nu kommer vi att förstå användningen av "gruppera efter" och "aggregerade funktioner" logiskt via ett exempel.

Skapa en tabell med namnet “människor”I databasen med hjälp av följande kod.

ANVÄND [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, [state] [varchar] (500) NULL, [age] [int] NULL) ON [PRIMARY] GO

Infoga nu data i tabellen med följande fråga.

infoga värden för människor (namn, stad, stat, ålder) ('Meggs', 'MONTEREY', 'CA', 20), ('Staton', 'HAYWARD', 'CA', 22), ('Järn', '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 ',' ELLER ', 35)

Utgången kommer att vara som:

Om analytikern behöver veta ingen av invånarna och deras ålder i de olika staterna. Följande fråga hjälper honom att få de resultat som krävs.

välj ålder, räkna (*) som antal_invånare från personer gruppera efter stat

Fel: Kolumnen 'people.age' är ogiltig i listan eftersom den inte finns i en aggregerad funktion eller GROUP BY-satsen.

Vid körning av ovannämnda fråga stötte vi på följande fel

”Msg 8120, nivå 16, tillstånd 1, rad 16 Kolumn‘ people.age ’är ogiltig i vallistan eftersom den inte finns i en aggregerad funktion eller GROUP BY-satsen.

Detta fel uppstår eftersom "GRUPP AV" frågan körs och du har inkluderat "'människor. ålder" kolumn i listan som varken ingår i gruppen efter klausul eller ingår i en samlad funktion.

Gruppering efter stat uppstår ett fel

Logisk beskrivning och lösning:

Detta är inte ett syntaxfel men det är ett logiskt fel. Som vi kan se att kolumnen "nej_av invånare" bara återvänder en enda rad, hur kan vi nu återställa åldern för alla invånare i en enda kolumn? Vi kan ha en lista över åldern på personer åtskilda med komma eller medelåldern, lägsta eller högsta ålder. Vi behöver alltså mer information om kolumnen "ålder". Vi måste kvantifiera vad vi menar med ålderskolumnen. Efter ålder vad vi vill få tillbaka. Nu kan vi ändra vår fråga med mer specifik information om ålderspelaren så här.

Hitta ingen av invånarna tillsammans med genomsnittsåldern för invånarna i varje stat. Med tanke på detta måste vi ändra vår fråga som visas nedan.

välj stat, genomsnitt (ålder) som ålder, räkna (*) som inga_av invånare från människor grupp för stat

Detta kommer att köras utan fel och utdata blir så här.

Så det är också viktigt att tänka logiskt om vad man ska returnera i det valda uttalandet.

Dessutom bör följande punkter beaktas samtidigt använda "gruppera efter" för att undvika fel.

Gruppera efter och NULL-värden:

Lägg först till en annan rad i tabellen med namnet ”personer” med kolumnen ”tillstånd” som tom / null.

infoga värden för människor (namn, stad, stat, ålder) ('Kanwal', 'GRESHAM', '', 35)

Utför nu följande uttalande.

välj stat, genomsnitt (ålder) som ålder, räkna (*) som inga_boende från människor grupp för stat

Följande bild visar dess resultat. Du kan se tomt värde i tillståndskolumnen betraktas som en separat grupp.

Öka nu inga null-rader genom att infoga fler rader i tabellen med null som tillstånd.

infoga i människor (namn, stad, delstat, ålder) värden ('Kanwal', 'IRVINE', 'NULL', 35), ('Krank', 'PLEASANT', 'NULL', 23)

Kör nu igen samma fråga för att välja utdata. Resultatuppsättningen blir så här.

Vi kan se i denna figur att en tom kolumn betraktas som en separat grupp och nollkolumnen med två rader betraktas som en annan separat grupp med två antal invånare. Så här fungerar "gruppera efter".

Facebook Twitter Google Plus Pinterest