Joulupähkinä #16 – Rekursio SQL:llä

Joulupähkinä #16 ponnistaa siitä mihin eilinen jäi! Eli kun katsoimme rekursiota DAX:lla, niin nyt sitten rekursiota SQL:llä. Kysymys on sama, eli Tee dbo.dimEmployee taulua vasten kysely, jossa muodostat alkuperäisen taulun+yhden uuden sarakkeen jossa on polku toimitusjohtajasta työntekijään.

Käytännössä siis SQL-selectin joukon tuloksen tulisi näyttää jotakuinkin tällaiselta sen uuden kolumnin osalta:

Ken on siis firman johtaja, jolla on Peter alaisena, jonka alaisena toimii Jo ja hänen alaisensa on Guy. Tämä sama päätelmä tulee laskea jokaiselle riville. Et saa lisätä selectiin kuin yhden kolumnin. Kaikki koodi on siis kirjoitettava yhteen lauseeseen, eikä tietokantaan saa luoda pysyväisobjekteja (#-tauluja tai normitauluja). Erotinmerkki on /-merkki.

Palauta select vastauksessasi.

Palvelin vanha tuttu:

Palvelin: qsql.database.windows.net
Käyttäjätunnus: joulu
Salasana: kalenteri123!
Tietokanta: AdventureWorksLT
Taulu: dbo.DimEmployee

EmployeeKey ja ParentEmployeeKey ovat ne kentät jotka muodostaa puun.

Palautat vastauksen tuttuun tyyliin Microsoft Forms-lomakkeella.

Pähkinän #15 ratkaisu – Rekursiivinen DAX

Tämä oli nyt selkeästi liian työläs… 6 vastausta, 2 tietyllä tavalla oikeaa, mutta ihan kauhean työlästä vastausta, jossa puurakenne oli purettu auki ja käsin haettiin jokainen taso eri muuttujaan jotka yhdistettiin. 4 hyvää yritystä.

Mallivastaus olisi

Organisaatio =
var pth = PATH(DimEmployee[EmployeeKey],[ParentEmployeeKey])
var tbl = ADDCOLUMNS( ADDCOLUMNS( ADDCOLUMNS( ADDCOLUMNS( GENERATESERIES(1,PATHLENGTH(pth)), “Manager”, PATHITEM(pth,[Value],INTEGER) ), “ManagerFirstName”,LOOKUPVALUE([FirstName],[EmployeeKey],[Manager]) ), “ManagerLastName”,LOOKUPVALUE([LastName],[EmployeeKey],[Manager]) ), “Manager FullName”,CONCATENATE([ManagerFirstName],CONCATENATE(” “,[ManagerLastName])))
var mngrpath = CONCATENATEX(tbl,[Manager FullName],”/”,[Value])
RETURN
mngrpath

Eli ensiksi rivillä 3 rakennetaan path-olio. Sitten luodaan aputaulu generateseries-funktion avulla (se tekee taulun, jossa on yksi kolumni, joka on Value ja sitten riveillä numerot 1,2,3…n, jossa n=pathlength.

Sitten siihen tauluun voidaan liittää managerin id tuolla pathitem funktiolla. Sen jälkeen parilla lookup-kierroksella voidaan hakea noi etunimi ja sukunimi arvot (yhdistän ne sen jälkeen fullnameksi). Ja sit lopulta contatenatex-funktiolla näppärästi yhdistetään kaikki rivit takaisin yhdeksi arvoksi, jolloin se voidaan palauttaa.