Forberedelse til kodeinterviews · Lektion

Leverandørspecifik PIVOT- og krydstabssyntaks

SQL Server PIVOT og Postgres crosstab samt deres begrænsninger.

Lektion 2 af 413 trin

Leverandørspecifik PIVOT- og krydstabssyntaks er en gratis Forberedelse til kodeinterviews-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Forberedelse til kodeinterviews, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Forberedelse til kodeinterviews-kurset indeholder 4 lektioner i alt.

Ud over betinget aggregering

Du kender allerede den portable CASE-pivotering. Men interviewere vil også vide, om du kan bruge leverandørspecifikke pivotoperatorer, når de er tilgængelige.

SQL Server leveres med den dedikerede PIVOT-operator. PostgreSQL tilbyder funktionen crosstab i udvidelsen tablefunc. Hvis du kender begge og deres faldgruber, viser det erfaring fra den virkelige verden.

Sådan er SQL Server PIVOT opbygget

SQL Servers PIVOT tager tre ting:

  • Et aggregat over værdikolonnen.
  • En FOR-klausul, der angiver kolonnen, hvis værdier skal blive til nye kolonner.
  • En IN-liste med de bogstavelige værdier, der skal omdannes til kolonner.

Den skal anvendes på en afledt tabel, der præcis viser nøglen, fordelingskolonnen og værdien – og ikke andet.

SELECT region, [Q1], [Q2]
FROM (SELECT region, quarter, amount FROM sales) AS src
PIVOT (
  SUM(amount)
  FOR quarter IN ([Q1], [Q2])
) AS p;

Den implicitte GROUP BY

En subtil PIVOT-faldgrube, som interviewere undersøger: Grupperingen er implicit. SQL Server grupperer efter hver kolonne i kilden, som ikke er den aggregerede kolonne eller FOR-kolonnen.

Hvis din afledte tabel ved en fejl også indeholder en ekstra kolonne som order_id, grupperer pivoteringen også efter den, og du får langt flere rækker end forventet. Begræns altid den indre forespørgsel til kun nøgle, fordelingskolonne og værdi.

-- 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_id

Kolonnenavne i kantede parenteser

I SQL Server er de pivoterede kolonnenavne de bogstavelige værdier fra dataene, omsluttet af kantede parenteser. Hvis en værdi begynder med et ciffer eller indeholder mellemrum, er kantede parenteser obligatoriske.

Du vælger dem med det samme navn i kantede parenteser i den ydre SELECT. Det er også grunden til, at PIVOT ikke kan håndtere ukendte værdier uden dynamisk SQL: IN-listen er hardkodet.

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 har ikke nøgleordet PIVOT. I stedet leverer udvidelsen tablefunc funktionen crosstab, som tager en SQL-streng og omformer dens output.

Du skal først aktivere udvidelsen. crosstab forventer, at kildeforespørgslen returnerer præcis tre kolonner: rækkeidentifikator, kategori og værdi, i den rækkefølge.

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);

Listen over kolonnedefinitioner

Den mest fejlbehæftede del af crosstab er den afsluttende liste over kolonnedefinitioner i AS ct(...). Du skal selv erklære outputkolonnernes navne og typer, og de skal svare til kategoriernes antal og rækkefølge.

Hvis en kategori mangler i en række, udfylder crosstab den efter position. Det kan forskyde dataene, medmindre du bruger formen med to argumenter nedenfor.

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 type

crosstab med to argumenter

Brug formen med to argumenter for at undgå forskydning, når nogle rækker mangler bestemte kategorier. Den anden forespørgsel returnerer den fulde, sorterede liste over kategoriværdier, så crosstab ved præcis, hvilken kolonne hver værdi hører til.

Det er den robuste form, interviewere forventer, når kategorierne er spredte.

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 har ingen af delene

Hvis intervieweren spørger til MySQL, er svaret enkelt: MySQL har hverken PIVOT eller crosstab. Din eneste mulighed er betinget aggregering med CASE (eller kortformen SUM(... ) + IF()).

Det er netop derfor, det portable CASE-mønster er så værdsat: Det er den fællesnævner, der virker overalt.

-- 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;

Gennemgået eksempel: Optælling af statusser i SQL Server

Et rapporteringsbehov kan være: „én række pr. region med en kolonne, der tæller ordrer for hver status“. I SQL Server giver du en beskåret, afledt tabel som input til PIVOT med COUNT.

Fordi du tæller selve statuskolonnen, bliver hver statusrække, der ikke er NULL, talt med i sin gruppe. Den ydre SELECT angiver hver status som en kolonne i kantede parenteser. Det er det korte alternativ til at skrive tre COUNT(CASE ...)-udtryk.

SELECT region, [pending], [shipped], [delivered]
FROM (SELECT region, status FROM orders) AS src
PIVOT (
  COUNT(status)
  FOR status IN ([pending], [shipped], [delivered])
) AS p;

Fælles begrænsninger

Både PIVOT og crosstab har den samme grundlæggende begrænsning som betinget aggregering: Outputkolonnerne skal være kendt, når du skriver forespørgslen.

  • SQL Server: IN-listen består af faste værdier.
  • Postgres crosstab: Listen over kolonnedefinitioner er fast angivet.

Ingen af dem kan finde kategorier automatisk under kørsel. Det kræver, at SQL-strengen bygges dynamisk.

Hvilken bør du bruge?

Et godt svar til en samtale sammenligner dem ærligt:

  • CASE-aggregering: portable, let at læse og fungerer i alle databasemotorer. Standardvalget.
  • SQL Server PIVOT: kortfattet ved mange kolonner, men den implicitte gruppering kommer ofte bag på folk.
  • Postgres crosstab: kraftfuld, men omstændelig; kræver en udvidelse og en liste over kolonnedefinitioner.

Vælg betinget aggregering, når du er i tvivl, og nævn leverandørernes operatorer som alternativer.

Hurtig kontrol

Få styr på den SQL Server PIVOT-adfærd, som interviewere undersøger.

Opsamling

Leverandørspecifik pivoteringssyntaks på én skærm:

  • SQL Server: PIVOT (SUM(x) FOR col IN ([a],[b])) med en implicit GROUP BY over de resterende kolonner.
  • Postgres: crosstab() fra tablefunc, som kræver en liste over kolonnedefinitioner; brug formen med to argumenter til spredte data.
  • MySQL: Ingen af delene findes, så brug CASE.
  • Alle tre kræver, at kolonnerne er kendt, når forespørgslen skrives.
Gratis at komme i gang

Lær Forberedelse til kodeinterviews med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
90
Lektioner
360

Ofte stillede spørgsmål

Er lektionen “Leverandørspecifik PIVOT- og krydstabssyntaks” gratis?

Ja — hele teksten til “Leverandørspecifik PIVOT- og krydstabssyntaks” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Forberedelse til kodeinterviews-kurset, skal du opgradere til CoddyKit PRO. Forberedelse til kodeinterviews-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Leverandørspecifik PIVOT- og krydstabssyntaks”?

SQL Server PIVOT og Postgres crosstab samt deres begrænsninger. Du øver dig i Forberedelse til kodeinterviews med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Forberedelse til kodeinterviews?

Der kræves ingen tidligere erfaring. Forberedelse til kodeinterviews på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Leverandørspecifik PIVOT- og krydstabssyntaks”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Forberedelse til kodeinterviews-lektion?

Ja. Alle Forberedelse til kodeinterviews-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Pivotering med betinget aggregering
  2. Leverandørspecifik PIVOT- og krydstabssyntaks
  3. Omdannelse af kolonner til rækker
  4. Dynamiske pivottabeller med ukendte kolonner
← Tilbage til Forberedelse til kodeinterviews