Power BI -matriisiin matala porautumishierarkia

Power BI -matriisiin matala porautumishierarkia

Power BI:n matriisissa voidaan esittää hierarkista tietoa. Usein kuitenkin on tilanteita, joissa ei haluta muodostaa syvää hierarkiaa. Tässä blogissa kerron, miten voit luoda sellaisen porautuvan matriisin, jossa hierarkia on matalampi ja jossa kuvailevia kenttiä esitetään vierekkäin.

Tiimi > Työntekijä -esimerkki

Esimerkissä käytetään Employee-nimistä taulua, jossa kukin työntekijä esiintyy kerran. Työntekijät kuuluvat tiimeihin (Team). Lisäksi tietomallissa on taulu, jossa on työntekijöihin liittyviä lukuja, mutta se ei ole esimerkin kannalta oleellinen.

Kun Power BI:ssä matriisin riveille (rows) lisätään kenttiä, ne muodostavat monitasoisen hierarkian:

Esimerkkitapauksessa kyseessä ei ole hierarkia, jossa työntekijätunnuksen alaisuudessa olisi useita henkilöitä, joiden alaisuudessa olisi sähköpostiosoitteita ja vieläpä puhelinnumeroita. Tiimit ja työntekijät muodostavat hierarkian, mutta työntekijää kuvailevat tiedot halutaan näyttää yksinkertaisesti vierekkäin.

Power BI -matriisia ei pysty muotoilemaan siten, että porautumissymbolit (plus ja miinus) olisivat vain tietyillä rivitasoilla ja loput tasoista näytettäisiin vierekkäisinä sarakkeina. Jos matriisi muotoillaan taulukkomuotoiseksi (tabular), porautumissymboleita ei saa halutuille tasoille. Ne pitää poistaa joko kokonaan tai näyttää jokaisessa rivikentässä.

Alla on esimerkki rakenteeltaan taulukkomuotoon (tabular) muotoillusta matriisista, jossa vaihtoehtoina on joko näyttää tai poistaa kaikki +/- symbolit.

Jos matriisiin halutaan toteuttaa matalampi porautumishierarkia, näyttää +/- symbolit vain tietyissä kentissä ja sijoittaa työntekijää kuvailevia samanarvoisia kenttiä vierekkäin, kuvailevat tiedot pitää toteuttaa mittareina (measures) ja sijoittaa ne matriisin arvoiksi (Values).

Kun matriisi on muodostettu, ensimmäisen kentän nimi on hyvä vaihtaa kuvaavaksi (esim. Team > Employee ID), jotta matriisin tarkastelijat ymmärtävät mitä ensimmäinen tunnusnumero tarkoittaa.

Ohje: Matriisin toteutus mittareiden avulla

  1. Sijoita matriisin riveille (rows) vain ne tasot, jotka haluat porautuviksi (kuvassa ainoastaan Team). Myöhemmin tässä blogissa on myös esimerkki, johon tulee syvempi hierarkia (Tuoteryhmä > Alituoteryhmä > Tuote).
  2. Sijoita riveille (rows) myös sellainen kenttä, joka yksilöi kunkin työntekijän (kuvassa EmployeeID). Yksilöllinen kenttä on pakollinen, jotta matalan matriisirakenteen saa toteutettua.
  3. Sijoita matriisiin vähintään yksi laskennallinen mittari (kuvassa Total Amount laskee summan). Laskennallinen mittari tai kenttä on myös pakollinen, jotta saat matriisin toimimaan.
  4. Toteuta muut matriisissa näytettävät tiedot mittareina ja sijoita myös ne arvoiksi (values).

Edellisessä kuvassa arvoiksi on sijoitettu laskennallisen Total Amount -summamittarin lisäksi seuraavat mittarit:

Employee Name = SELECTEDVALUE( Employee[Employee FullName] )
E-mail = SELECTEDVALUE( Employee[EmailAddress] )
Phone Number = SELECTEDVALUE( Employee[Phone] )

Lopputuloksessa on vain yksi porautumistaso, jonka alta avautuu työntekijätunnuksen lisäksi arvoiksi sijoitettuja kuvailevia tietoja sekä jokin laskennallinen tulos.

Vaikka lopputulos näyttääkin jo hyvältä, jatka lukemista, sillä tämän esimerkin DAX-mittarit eivät toimi halutulla tavalla kaikissa tilanteissa eli konteksteissa.

Tuoteryhmä > Alituoteryhmä > Tuote -esimerkki

SELECTEDVALUE-mittaria ei yleensä voi käyttää sellaisenaan, sillä se saattaa näyttää arvoja myös hierarkian ylemmillä tasoilla.

Seuraavassa esimerkissä mittarit näyttävät tuotteen nimen sekä värin.

Product Name = SELECTEDVALUE( 'Product'[Product] )
Product Color = SELECTEDVALUE( 'Product'[Color] )

Kun Category > Subcategory > ProductID -matriisia tarkastellaan, huomataan että tulos ei näytä loogiselta. Bib-Shorts -alituoteryhmän (subcategory) ja monien muiden alituoteryhmien kohdalla näytetään väri. Lisäksi Caps-tuoteryhmän (category) kohdalla näytetään värin lisäksi myös tuotteen nimi.

Epäloogisuus johtuu siitä, että SELECTEDVALUE-funktio näyttää aina tuloksen, jos se muodostuu YHDESTÄ arvosta olipa kyseessä tuote, alituoteryhmä tai tuoteryhmä.

Kun esimerkiksi Product Color -mittari suoritetaan Bib-Shorts -alituoteryhmäkontekstissa ja kaikki alituoteryhmän tuotteet ovat Multi-värisiä, tulos muodostuu yhdestä arvosta ”Multi”, joten se annettaan tuloksena.

Kun sama funktio suoritetaan Clothing-tuoteryhmäkontekstissa, tuoteryhmään kuuluu runsaasti tuotteita, joilla on useita eri värejä (Multi, Black, White, Blue), jolloin SELECTEDVALUE-funktion tulos olisi useista arvoista muodostuva lista. Tällaisessa tapauksessa SELECTEDVALUE antaa tulokseksi tyhjän arvon.

SELECTEDVALUE-funktion sisäänrakennettu toimintaperiaate on siis: ”jos tulos muodostuu yhdestä arvosta, anna arvo tulokseksi, muussa tapauksessa anna tulokseksi tyhjä arvo”. Ja DAX-kielen toimintaperiaatehan on, että jokainen mittari suoritetaan jokaisessa konstekstissa, mutta kaavasta riippuen mittari joko antaa arvon tai ei.

Jotta matriisiin saa siististi nimet ja värit vain tuoteriveille, kaavat pitää korjata sellaisiksi, että ne tutkivat kontekstin ja antavat tuloksen vain silloin, kun mittari suoritetaan tuote-kontekstissa. Sekä Product Name että Product Color -mittarit pitää muokata alla olevan kaltaisiksi, jotta ne antavat tuloksen vain kullekin tuotteelle (ProductID), ei alituoteryhmille (SubCategory) tai tuoteryhmille (Category).

Product Name = 
IF(
    ISINSCOPE( 'Product'[ProductID] ),
    SELECTEDVALUE( 'Product'[Product] )
)

Jotta ISINSCOPE-funktio toimii oikein, sille pitää antaa argumenttina täsmälleen se yksilöllinen kenttä, jota on käytetty matriisin riveillä. Tässä tapauksessa tuotteen id.

Entäpä kuvaileva tai laskennallinen tieto

Palataanpa vielä hetkeksi takaisin tiimeittäiseen työntekijämatriisiin. Saisiko työntekijä-kontekstissa esiin työntekijän nimen, mutta muissa konteksteissa työntekijöiden lukumäärän?

Kaava pitäisi tässä tapauksessa kirjoittaa muodossa:

Employee Name/QTY = 
IF( 
    ISINSCOPE( Employee[EmployeeID]),
    SELECTEDVALUE( Employee[Employee FullName] ),
    COUNTROWS( Employee )
)

Yhteenveto

Olemme tarkastelleet, miten voit hallita porautuvan matriisin syvyyttä ja käyttää DAX-funktioita, kuten SELECTEDVALUE ja ISINSCOPE, jotta saat esitettyä haluamasi tiedot.

Toivottavasti nämä ohjeet auttavat sinua laatimaan toimivampia matriiseita. Jos sinulla on kysyttävää tai tarvitset lisäapua, ethän epäröi ottaa yhteyttä!

Lisätietoja:

Jätä kommentti