Taulujen litistäminen (Flattening)

Kirjoittanut Samu Lahdenperä · Julkaistu 1.6.2026

Litistäminen tarkoittaa useamman hierarkkisen taulun yhdistämistä yhdeksi leveäksi tauluksi ennen sen käyttöä semanttisessa tietomallissa. Tavoitteena on muuttaa lumihiutalemainen rakenne tähtimallin mukaiseksi: yksi dimensio, yksi taulu.

Litistäminen osana ETL-prosessia

Litistäminen kannattaa tehdä tietovarastoon ETL-prosessin muunnosvaiheessa (Transform), ennen kuin data ladataan käytettäväksi. Lähdejärjestelmässä tieto on normalisoituna useampaan tauluun; ETL-vaihe yhdistää ne yhdeksi leveäksi dimensioksi JOIN-operaatioilla tai SQL-näkymällä.

Dokumentoi data lineage: mitkä lähdetaulut yhdistyvät, millä avaimilla ja missä järjestyksessä. Tämä tieto on kriittistä sekä debuggauksessa että tietomallin ylläpidossa.

flowchart LR t1["Yritys"] --> etl["ETL / SQL VIEW\nJOIN × 2"] t2["Liiketoimintaryhmä"] --> etl t3["Kustannuspaikka"] --> etl etl --> dim["V_D_Kustannuspaikka\n(litistetty)"] dim --> pbi["Power BI\nVertiPaq"]
Data lineage: kolme lähdetaulua yhdistyy yhdeksi litistetyksi dimensioksi ETL-vaiheen kautta.
CREATE VIEW V_D_Kustannuspaikka AS
SELECT
    kp.KpID,
    kp.Kustannuspaikka,
    kp.KpID & ' – ' & kp.Kustannuspaikka  AS KpAvain,
    r.RyhmaID,
    r.Liiketoimintaryhmä,
    r.RyhmaID & ' – ' & r.Liiketoimintaryhmä AS RyhmaAvain,
    y.YritysID,
    y.Yritys,
    y.YritysID & ' – ' & y.Yritys           AS YritysAvain
FROM Kustannuspaikka    AS kp
JOIN Liiketoimintaryhmä AS r  ON kp.RyhmaID = r.RyhmaID
JOIN Yritys             AS y  ON r.YritysID  = y.YritysID
Dataneuvoksen mielipide

Miksi litistäminen tehdään?

Power BI:n VertiPaq-moottori on optimoitu tähtimallille: leveille, litteille tauluille, joissa on matala kardinaliteetti. Kun dimensiot ovat hajautettuna useampaan tauluun hierarkkisesti (lumihiutalemalli), syntyy tarpeettomia relaatioketjuja, jotka hidastavat kyselyitä ja tekevät DAX-koodaamisesta monimutkaisempaa.

Esimerkki: organisaatiohierarkia

Lumihiutalemallissa organisaatiorakenne voi näyttää tältä — kolme erillistä taulua, joissa tieto on hajautettuna hierarkkisesti:

Ennen litistämistä — 3 taulua hierarkiassa:
Yritys YritysID
Yritys Oy 1
Liiketoimintaryhmä RyhmaID YritysID (FK)
Kuluttajaliiketoiminta 10 1
Yritysasiakkaat 11 1
Kustannuspaikka KpID RyhmaID (FK)
Helsinki-myymälä 100 10
Tampere-myymälä 101 10
Yrityspalvelut Etelä 102 11
Litistämisen jälkeen — 1 taulu:
KpID Kustannuspaikka RyhmaID Liiketoimintaryhmä YritysID Yritys
100 Helsinki-myymälä 10 Kuluttajaliiketoiminta 1 Yritys Oy
101 Tampere-myymälä 10 Kuluttajaliiketoiminta 1 Yritys Oy
102 Yrityspalvelut Etelä 11 Yritysasiakkaat 1 Yritys Oy

Hierarkian yläosien tieto (liiketoimintaryhmä, yritys) toistetaan joka rivillä. Tämä on tarkoituksellista. VertiPaq pakkaa toistuvat arvot tehokkaasti, joten muistikoko ei kasva merkittävästi.

Litistämisen jälkeen — yhdistelmäkentillä:
KpID KpAvain RyhmaID RyhmaAvain YritysID YritysAvain
100 100 – Helsinki-myymälä 10 10 – Kuluttajaliiketoiminta 1 1 – Yritys Oy
101 101 – Tampere-myymälä 10 10 – Kuluttajaliiketoiminta 1 1 – Yritys Oy
102 102 – Yrityspalvelut Etelä 11 11 – Yritysasiakkaat 1 1 – Yritys Oy

Yhdistelmäkenttä yhdistää numeerisen avaimen ja nimen yhdeksi sarakkeeksi, esim. KpAvain = KpID & " – " & Kustannuspaikka. Tämä mahdollistaa lajittelun numeerisen avaimen mukaan samalla kun visuaaleissa näkyy selkokielinen nimi.