Pivotering med villkorsstyrd aggregering
Det portabla mönstret med CASE inuti SUM för att omvandla rader till kolumner.
Pivotering med villkorsstyrd aggregering är en gratis lektion i Förberedelser inför SQL-intervjun på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Förberedelser inför SQL-intervjun, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.
Intervjusituationen
En av de vanligaste uppgifterna i rapporteringsintervjuer är att omvandla rader till kolumner. Ni har en lång tabell som sales(region, quarter, amount) och intervjuaren vill ha en bred rapport med en kolumn per kvartal.
Det portabla, dialektoberoende svar som intervjuaren vill höra är villkorsstyrd aggregering: ett CASE-uttryck placerat inuti en aggregation som SUM. Lär er detta så kan ni pivåtera i vilken databas som helst, även databaser som saknar nyckelordet PIVOT.
Långt och brett format
Definiera formaten innan ni pivåterar. Långt format lagrar ett faktum per rad: varje par av region och kvartal har sin egen rad. Brett format sprider en kategori över flera kolumner.
- Långt format: enkelt att infoga data i, svårt att läsa sida vid sida.
- Brett format: utmärkt för en rapport som ska läsas av människor.
En pivotering omvandlar långt format till brett. Intervjuare uppskattar detta eftersom det testar om ni förstår aggregering, inte bara syntax.
-- Long form (the input)
region | quarter | amount
-------+---------+-------
East | Q1 | 100
East | Q2 | 150
West | Q1 | 200
West | Q2 | 250Grundmönstret
Tricket är att för varje resultatkolumn skriva ett CASE som returnerar värdet när raden motsvarar den kolumnen och NULL annars. Omslut det med en aggregation så att gruppen reduceras till en rad per nyckel.
Tolka det som: summera beloppet, men bara för Q1-raderna. Eftersom SUM ignorerar NULL bidrar de rader som inte matchar inte med något.
SELECT
region,
SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2
FROM sales
GROUP BY region;Varför SUM ignorerar NULL
Det här mönstret fungerar tack vare en sak som intervjuare ofta frågar om: aggregeringsfunktioner hoppar över NULL. Ett CASE utan ELSE returnerar NULL när ingen gren matchar, så SUM(CASE WHEN ... THEN amount END) adderar endast de rader ni har valt.
Om ni i stället skrev ELSE 0 skulle det också fungera för SUM (att addera noll ändrar ingenting), men det skulle ge fel resultat för AVG, MIN och COUNT.
-- Both produce the same SUM result:
SUM(CASE WHEN quarter = 'Q1' THEN amount END)
SUM(CASE WHEN quarter = 'Q1' THEN amount ELSE 0 END)Genomgångsexempel: Kvartalsrapport
Här är hela frågan mot exempeldata. Varje region blir en rad och varje kvartal blir en kolumn.
GROUP BY region är det som slår ihop de fyra indataraderna till två resultatrader. Utan den skulle du få en rad per indatarad, med mestadels NULL-värden.
SELECT
region,
SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2
FROM sales
GROUP BY region;
-- Result:
-- region | q1 | q2
-- East | 100 | 150
-- West | 200 | 250Välja rätt aggregatfunktion
Aggregatfunktionen som du bäddar in CASE i måste motsvara frågan:
SUMnär varje cell summerar värden.MAXellerMINnär varje kombination av region och kvartal har exakt ett värde och du bara vill visa det.COUNTnär varje cell räknar matchande rader.
Intervjuare frågar ofta om COUNT-varianten: hur många order per status och månad?
SELECT
month,
COUNT(CASE WHEN status = 'shipped' THEN 1 END) AS shipped,
COUNT(CASE WHEN status = 'cancelled' THEN 1 END) AS cancelled
FROM orders
GROUP BY month;MAX för celler med ett värde
När varje nyckel/kategori-par innehåller ett enda värde (en riktig korstabell, inte en totalsumma) använder du MAX eller MIN. Båda returnerar det enda värdet som inte är NULL och ignorerar NULL-värdena från grenar som inte matchar.
Detta är det säkra valet när du omformar attribut i stället för att summera pengar, till exempel när du omvandlar en tabell med inställningar i formatet nyckel/värde till en rad per entitet.
-- Turn key/value rows into one wide row per user
SELECT
user_id,
MAX(CASE WHEN attr = 'city' THEN value END) AS city,
MAX(CASE WHEN attr = 'plan' THEN value END) AS plan
FROM user_attributes
GROUP BY user_id;Hantera NULL-celler i resultatet
Om en region inte hade någon försäljning under Q2 blir dess q2-cell NULL. Intervjuaren kan be dig visa 0 i stället. Omslut hela aggregatfunktionen med COALESCE.
Placera COALESCE utanför aggregatfunktionen, inte inuti CASE, så att du bara ersätter värdet när hela gruppen saknar matchande rader.
SELECT
region,
COALESCE(SUM(CASE WHEN quarter = 'Q1' THEN amount END), 0) AS q1,
COALESCE(SUM(CASE WHEN quarter = 'Q2' THEN amount END), 0) AS q2
FROM sales
GROUP BY region;Lägga till en kolumn för totalsumma
En vanlig följdfråga är att lägga till en totalsumma för alla pivoterade kolumner. Du behöver inte addera kolumnerna med namn. En vanlig SUM(amount) över samma grupp ger radens totalsumma, eftersom den helt bortser från CASE-filtreringen.
Det visar intervjuaren att du förstår att varje aggregat i SELECT beräknas oberoende över samma grupp.
SELECT
region,
SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2,
SUM(amount) AS total
FROM sales
GROUP BY region;Genvägen med filtrerad aggregering
PostgreSQL och SQL-standarden stöder FILTER (WHERE ...), ett renare sätt att skriva villkorad aggregering. Det blir mer lättläst och du slipper standardkoden med CASE.
Nämn detta under en intervju för att visa bredd, men tänk på att MySQL och SQL Server inte stöder det, så CASE är fortfarande det portabla svaret.
-- Postgres / standard SQL
SELECT
region,
SUM(amount) FILTER (WHERE quarter = 'Q1') AS q1,
SUM(amount) FILTER (WHERE quarter = 'Q2') AS q2
FROM sales
GROUP BY region;Den stora begränsningen
Villkorad aggregering har en hake som intervjuare gärna trycker på: du måste ange varje resultatkolumn manuellt. Om kvartalen eller kategorierna inte är kända i förväg kan den här statiska frågan inte anpassa sig.
Det problemet kallas en dynamisk pivotering och kräver genererad SQL. För en fast, känd uppsättning kategorier är villkorad aggregering däremot det rena, portabla förstahandsvalet.
Snabbtest
Testa hur väl du behärskar mönstret för villkorad aggregering.
Sammanfattning
Villkorad aggregering är den portabla pivotlösning som alla intervjuare accepterar:
- En
CASEper resultatkolumn, omsluten av en aggregatfunktion. SUMför totalsummor,MAX/MINför celler med ett enda värde ochCOUNTför antal.- Fungerar eftersom aggregat ignorerar
NULLfrån grenar som inte matchar. - Använd
COALESCEför att omvandla tomma celler till 0. - Begränsning: kolumnerna måste hårdkodas, vilket leder vidare till dynamisk pivotering.
Lär dig SQL med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 30
- Lektioner
- 120
Vanliga frågor
Är lektionen ”Pivotering med villkorsstyrd aggregering” gratis?
Ja – hela texten till ”Pivotering med villkorsstyrd aggregering” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Förberedelser inför SQL-intervjun, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.
Vad lär jag mig i ”Pivotering med villkorsstyrd aggregering”?
Det portabla mönstret med CASE inuti SUM för att omvandla rader till kolumner. Ni övar på Förberedelser inför SQL-intervjun med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Förberedelser inför SQL-intervjun?
Du behöver inga förkunskaper. Utbildningen i Förberedelser inför SQL-intervjun på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Pivotering med villkorsstyrd aggregering”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Förberedelser inför SQL-intervjun-lektionen?
Ja. Varje Förberedelser inför SQL-intervjun-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Pivotering med villkorsstyrd aggregering
- Leverantörsspecifik PIVOT- och korstabellssyntax
- Omvandla kolumner till rader
- Dynamisk pivotering med okända kolumner