PIVOT- en crosstab-syntaxis per databaseleverancier
SQL Server PIVOT en Postgres crosstab, inclusief hun beperkingen.
PIVOT- en crosstab-syntaxis per databaseleverancier is een gratis Voorbereiding op SQL-sollicitatiegesprekken-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Voorbereiding op SQL-sollicitatiegesprekken. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Voorbereiding op SQL-sollicitatiegesprekken bevat in totaal 4 lessen.
Verder dan voorwaardelijke aggregatie
Je kent de platformonafhankelijke draaitabel met CASE al. Maar interviewers willen ook weten of je leveranciersspecifieke operatoren voor draaitabellen kunt gebruiken wanneer die beschikbaar zijn.
SQL Server levert een speciale PIVOT-operator. PostgreSQL biedt een crosstab-functie in de tablefunc-extensie. Als je beide kent, inclusief hun valkuilen, laat je echte praktijkervaring zien.
Anatomie van SQL Server PIVOT
SQL Server's PIVOT heeft drie onderdelen:
- Een aggregatiefunctie over de waardekolom.
- Een
FOR-clausule die de kolom benoemt waarvan de waarden nieuwe kolommen worden. - Een
IN-lijst met de letterlijke waarden die in kolommen moeten worden omgezet.
De operator moet worden toegepast op een afgeleide tabel die precies de sleutel, de spreidingskolom en de waarde beschikbaar maakt, en niets meer.
SELECT region, [Q1], [Q2]
FROM (SELECT region, quarter, amount FROM sales) AS src
PIVOT (
SUM(amount)
FOR quarter IN ([Q1], [Q2])
) AS p;De impliciete groepering
Een subtiele valkuil van PIVOT waarop interviewers je toetsen, is dat de groepering impliciet is. SQL Server groepeert op elke kolom in de bron die NIET de geaggregeerde kolom of de FOR-kolom is.
Als je afgeleide tabel per ongeluk een extra kolom zoals order_id bevat, groepeert de draaitabel daar ook op en krijg je veel meer rijen dan verwacht. Beperk de binnenste query daarom altijd tot alleen sleutel, spreidingskolom en waarde.
-- WRONG: order_id leaks in and breaks grouping
FROM (SELECT region, quarter, amount, order_id FROM sales) AS src
PIVOT (SUM(amount) FOR quarter IN ([Q1],[Q2])) AS p;
-- The pivot now groups by region AND order_idKolomnamen tussen vierkante haken
In SQL Server zijn de namen van de gedraaide kolommen de letterlijke waarden uit de gegevens, omsloten door vierkante haken. Als een waarde met een cijfer begint of spaties bevat, zijn vierkante haken verplicht.
Je selecteert deze kolommen met dezelfde naam tussen vierkante haken in de buitenste SELECT. Daarom kan PIVOT ook niet zonder dynamische SQL overweg met onbekende waarden: de IN-lijst is hardgecodeerd.
SELECT region, [2023], [2024]
FROM (SELECT region, yr, amount FROM sales) AS s
PIVOT (SUM(amount) FOR yr IN ([2023], [2024])) AS p;PostgreSQL crosstab
PostgreSQL heeft geen sleutelwoord PIVOT. In plaats daarvan biedt de tablefunc-extensie de functie crosstab, die een SQL-tekenreeks aanneemt en de uitvoer ervan herschikt.
Je moet de extensie eerst inschakelen. crosstab verwacht dat de bronquery precies drie kolommen teruggeeft: rij-identificatie, categorie en waarde, in die volgorde.
CREATE EXTENSION IF NOT EXISTS tablefunc;
SELECT *
FROM crosstab(
'SELECT region, quarter, amount FROM sales ORDER BY 1, 2'
) AS ct(region text, q1 numeric, q2 numeric);De lijst met kolomdefinities
Het foutgevoeligste onderdeel van crosstab is de afsluitende kolomdefinitielijst AS ct(...). Je moet de namen en typen van de uitvoerkolommen zelf opgeven. Deze moeten overeenkomen met het aantal en de volgorde van de categorieën.
Als een categorie voor een rij ontbreekt, vult crosstab de waarden op positie in. Daardoor kunnen gegevens verkeerd uitgelijnd raken, tenzij je de tweeargumentenvorm hieronder gebruikt.
SELECT *
FROM crosstab(
'SELECT region, quarter, amount FROM sales ORDER BY 1, 2'
) AS ct(region text, q1 numeric, q2 numeric);
-- ct(...) MUST list every output column and its typecrosstab met twee argumenten
Gebruik de tweeargumentenvorm om verkeerde uitlijning te voorkomen wanneer sommige rijen bepaalde categorieën missen. De tweede query geeft de volledige, geordende lijst met categoriewaarden terug, zodat crosstab precies weet in welke kolom elke waarde hoort.
Dit is de robuuste vorm die interviewers verwachten wanneer categorieën schaars zijn.
SELECT *
FROM crosstab(
'SELECT region, quarter, amount FROM sales ORDER BY 1, 2',
'SELECT DISTINCT quarter FROM sales ORDER BY 1'
) AS ct(region text, q1 numeric, q2 numeric);MySQL heeft geen van beide
Als de interviewer naar MySQL vraagt, is het antwoord eenvoudig: MySQL heeft geen PIVOT en geen crosstab. Je enige optie is daar voorwaardelijke aggregatie met CASE (of de verkorte notatie SUM(... ) + IF()).
Precies daarom wordt het platformonafhankelijke CASE-patroon zo gewaardeerd: het is de gemene deler die overal werkt.
-- MySQL: only conditional aggregation works
SELECT
region,
SUM(IF(quarter = 'Q1', amount, 0)) AS q1,
SUM(IF(quarter = 'Q2', amount, 0)) AS q2
FROM sales
GROUP BY region;Uitgewerkt voorbeeld: statusaantallen in SQL Server
Een verzoek voor een rapport: "één rij per regio, met een kolom die de bestellingen per status telt." In SQL Server geef je een beperkte afgeleide tabel door aan PIVOT en gebruik je COUNT.
Omdat je de statuskolom zelf telt, wordt elke niet-NULL-statusrij in een groep meegeteld. De buitenste SELECT vermeldt elke status als kolom tussen vierkante haken. Dit is een beknopt alternatief voor het schrijven van drie expressies met COUNT(CASE ...).
SELECT region, [pending], [shipped], [delivered]
FROM (SELECT region, status FROM orders) AS src
PIVOT (
COUNT(status)
FOR status IN ([pending], [shipped], [delivered])
) AS p;Gedeelde beperkingen
Ook PIVOT en crosstab hebben dezelfde kernbeperking als voorwaardelijke aggregatie: de uitvoerkolommen moeten bekend zijn wanneer je de query schrijft.
- SQL Server: de
IN-lijst is letterlijk. - Postgres crosstab: de lijst met kolomdefinities is letterlijk.
Geen van beide kan tijdens de uitvoering categorieën ontdekken. Daarvoor moet je de SQL-tekenreeks dynamisch opbouwen.
Welke moet je gebruiken?
Een goed antwoord in een sollicitatiegesprek vergelijkt ze eerlijk:
- Aggregatie met CASE: platformonafhankelijk, leesbaar en werkt in elke database-engine. De standaardkeuze.
- SQL Server PIVOT: beknopt bij veel kolommen, maar de impliciete groepering brengt mensen vaak in verwarring.
- Postgres crosstab: krachtig maar uitgebreid, en vereist een extensie en een lijst met kolomdefinities.
Kies bij twijfel voor voorwaardelijke aggregatie en noem de leveranciersoperatoren als alternatieven.
Korte controle
Leg het gedrag van SQL Server PIVOT vast waarop interviewers doorvragen.
Samenvatting
De syntaxis voor draaitabellen van leveranciers op één scherm:
- SQL Server:
PIVOT (SUM(x) FOR col IN ([a],[b])), met een impliciete groepering over de overgebleven kolommen. - Postgres:
crosstab()uittablefunc, met een lijst met kolomdefinities; gebruik de tweeargumentenvorm voor schaarse gegevens. - MySQL: geen van beide bestaat, gebruik
CASE. - Bij alle drie moeten de kolommen bekend zijn wanneer je de query schrijft.
Leer SQL met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 30
- Lessen
- 120
Veelgestelde vragen
Is de les “PIVOT- en crosstab-syntaxis per databaseleverancier” gratis?
Ja — de volledige tekst van “PIVOT- en crosstab-syntaxis per databaseleverancier” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Voorbereiding op SQL-sollicitatiegesprekken wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Voorbereiding op SQL-sollicitatiegesprekken bevat in totaal 4 lessen.
Wat leer ik in “PIVOT- en crosstab-syntaxis per databaseleverancier”?
SQL Server PIVOT en Postgres crosstab, inclusief hun beperkingen. Je oefent met Voorbereiding op SQL-sollicitatiegesprekken door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Voorbereiding op SQL-sollicitatiegesprekken te beginnen?
Ervaring vooraf is niet nodig. Voorbereiding op SQL-sollicitatiegesprekken op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “PIVOT- en crosstab-syntaxis per databaseleverancier”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Voorbereiding op SQL-sollicitatiegesprekken?
Ja. Elke les over Voorbereiding op SQL-sollicitatiegesprekken bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Pivots maken met conditionele aggregatie
- PIVOT- en crosstab-syntaxis per databaseleverancier
- Kolommen terugzetten naar rijen
- Dynamische pivots met onbekende kolommen