SQL Academy · Oppitunti

CASE-lausekkeet ja pivot-kyselyt

Käyttäkää CASE WHEN -rakennetta aggregointien sisällä muuntaaksenne pitkät taulut leveiksi ristiintaulukoiduiksi raporteiksi.

Oppitunti 3/413 vaihetta

CASE-lausekkeet ja pivot-kyselyt on ilmainen SQL Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu SQL Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. SQL Academy-kurssilla on yhteensä 4 oppituntia.

CASE: SQL:n sisäinen if/else

CASE on SQL:n ternary-rakenne. Sillä on kaksi muotoa:

-- Searched CASE
CASE WHEN x > 0 THEN 'positive'
     WHEN x < 0 THEN 'negative'
     ELSE 'zero' END

-- Simple CASE
CASE status
  WHEN 'A' THEN 'active'
  WHEN 'P' THEN 'pending'
  ELSE 'unknown'
END

CASE SELECT-lauseessa

Laske johdettu sarake:

SELECT id, total,
       CASE
         WHEN total >= 1000 THEN 'whale'
         WHEN total >=  100 THEN 'regular'
         ELSE 'small'
       END AS bucket
FROM orders;

CASE WHERE- ja ORDER BY -lausekkeissa

Mukautettu suodatus ja järjestäminen:

-- Custom sort:
ORDER BY
  CASE WHEN status = 'urgent' THEN 0 ELSE 1 END,
  created_at DESC;

-- Conditional filter:
WHERE CASE WHEN $1 = 'paid' THEN status = 'paid'
           ELSE status IN ('pending','paid')
      END;

CASE aggregaattifunktioiden sisällä: ehdolliset lukumäärät

Klassinen pivotointikikka:

SELECT user_id,
       COUNT(*) AS total,
       SUM(CASE WHEN status = 'paid'      THEN 1 ELSE 0 END) AS paid,
       SUM(CASE WHEN status = 'pending'   THEN 1 ELSE 0 END) AS pending,
       SUM(CASE WHEN status = 'cancelled' THEN 1 ELSE 0 END) AS cancelled
FROM orders
GROUP BY user_id;

FILTER: selkeämpi vaihtoehto

PostgreSQL:n FILTER-lauseke on luettavampi:

SELECT user_id,
       COUNT(*)                                     AS total,
       COUNT(*) FILTER (WHERE status = 'paid')      AS paid,
       COUNT(*) FILTER (WHERE status = 'pending')   AS pending,
       COUNT(*) FILTER (WHERE status = 'cancelled') AS cancelled
FROM orders
GROUP BY user_id;

Kuukausien pivotointi sarakkeiksi

Muuntakaa pitkä esitysmuoto leveäksi CASE-lausekkeen ja aggregaattifunktion avulla:

SELECT year,
       SUM(CASE WHEN month =  1 THEN revenue END) AS jan,
       SUM(CASE WHEN month =  2 THEN revenue END) AS feb,
       -- ...
       SUM(CASE WHEN month = 12 THEN revenue END) AS dec
FROM monthly_revenue
GROUP BY year
ORDER BY year;

Luokkien pivotointi

Yksi rivi käyttäjää kohden ja yksi sarake tilaa kohden:

SELECT user_id,
       SUM(total) FILTER (WHERE status = 'paid')      AS paid_total,
       SUM(total) FILTER (WHERE status = 'pending')   AS pending_total
FROM orders GROUP BY user_id;

CASE-pivotointien rajoitukset

Kohdesarakkeet on tunnettava jo kyselyä kirjoitettaessa. Dynaamisia pivotointeja varten muodostakaa SQL sovelluksessa tai käyttäkää proseduraalista PL/pgSQL:ää.

CASE vs COALESCE / NULLIF

COALESCE = "ensimmäinen ei-NULL-arvo". NULLIF = "NULL, jos arvot ovat yhtäsuuret". CASE on yleiskäyttöisempi — käyttäkää sitä, kun COALESCE tai NULLIF ei sovellu.

Tyyppien yhteensopivuus

Kaikkien CASE-haarojen on palautettava yhteensopivat tyypit. Muuntakaa tyypit eksplisiittisesti, jos yhdistätte eri tyyppejä:

SELECT CASE WHEN x THEN 1::TEXT ELSE 'no' END;

Sisäkkäinen CASE

Monitasoinen haarautuminen:

SELECT CASE
  WHEN amount IS NULL THEN 'no payment'
  WHEN amount = 0     THEN 'free'
  WHEN amount < 10    THEN 'cheap'
  ELSE
    CASE WHEN paid_at IS NULL THEN 'overdue' ELSE 'paid' END
END AS status FROM invoices;

Kertaus

CASE on SQL:n yleiskäyttöinen "if/else"-rakenne.

  • SELECT-lauseen lasketut sarakkeet
  • Pivotoinnit CASE-aggregaattifunktion tai FILTER-lausekkeen avulla
  • Mukautettu WHERE- ja ORDER BY -logiikka

Pikatarkistus

Mikä lauseke on PostgreSQL:ssä luettavin vaihtoehto ehdolliseen aggregointiin?

Aloita maksutta

Opi SQL tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
46
Oppitunnit
183

Usein kysytyt kysymykset

Onko oppitunti ”CASE-lausekkeet ja pivot-kyselyt” ilmainen?

Kyllä – oppitunnin ”CASE-lausekkeet ja pivot-kyselyt” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko SQL Academy-kurssin, päivitä CoddyKit PROhon. SQL Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”CASE-lausekkeet ja pivot-kyselyt”?

Käyttäkää CASE WHEN -rakennetta aggregointien sisällä muuntaaksenne pitkät taulut leveiksi ristiintaulukoiduiksi raporteiksi. Harjoittelet SQL Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni SQL Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin SQL Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”CASE-lausekkeet ja pivot-kyselyt”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä SQL Academy-oppitunnilla?

Kyllä. Jokainen SQL Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. UNION, INTERSECT, EXCEPT
  2. UNION ALL vs UNION (kaksoiskappaleiden poiston kustannus)
  3. CASE-lausekkeet ja pivot-kyselyt
  4. Ristiintaulukointimallit (PostgreSQL crosstab())
← Takaisin: SQL Academy