SELECT O.Ordrenr, xxx(OL.Tekst), SUM(OL.Beløb) FROM Ordrer AS O LEFT OUTER JOIN Ordrelinjer AS OL ON OL.OrdreID = O.ID GROUP BY O.Ordrenr
Spørgsmålet lyder hvordan jeg laver en aggregat funktion, der fungerer på varchar's - og som returner linjens værdi, hvis der er en linje - og "Ifølge spec", hvis der er mere end en.
Og det ville være rigtig lækkert, hvis den stadig returnerer linjens værdi, hvis den er ens for alle berørte linjer.
Med kunstig intelligens skaber HP’s nye OmniBook X 14 en unik og skræddersyet brugeroplevelse målrettet dem, der ønsker høj ydeevne og intelligente funktioner
Lyder rimelig weird, har du en datamodel som du kan forklare lidt tydeligere?
Umiddelbart ville jeg bruge mit BL-lag til den slags ;)
Synes godt om
Slettet bruger
26. maj 2008 - 08:24#3
Ok - var lidt sent :)
Det er en grouped left outer join - dvs. at for hver ordre skal jeg have en linje i resultatsættet.
Der er en en-til-mange relation mellem ordre og ordrelinjerne. Dvs. der kan være 0 eller flere linjer per ordre, som skal aggregeres på teksten og beløbet:
Skal give 1 linje i resultatsættet: 1, "Ifølge specifikation", 250
Ordre 2 - 1 ordrelinje: "sokker", 1300
Skal give 1 linje i resultatsættet: 2, "sokker", 1300
Ordre 3 - 0 ordrelinjer:
skal give 1 linje i resultatsættet: 3, null, null
Det jeg leder efter er en funktion a'la Sum() for varchar's. Lige nu bruger jeg enten Max() eller Min() men det giver den uheldige bivirkning at brugerne bliver forvirrede, fordi de tror at det er tilfældigt, hvilken linje der vises :).
Ved 0 ordrelinjer skal den returnere null. Ved 1 ordrelinje skal den give teksten tilbage. Ved 2+ ordrelinjer skal den give en fast tekst uafhængigt af hvad der står på de enkelte linjer (her "Ifølge specifikation").
Håber det forklarede det lidt bedre.
Synes godt om
Slettet bruger
26. maj 2008 - 08:27#4
Og problemet med at lægge det i BL-laget er at det giver uhyggeligt mange data-kald og der er stor sandsynlighed for at jeg fucker det op (jeg har ialt 8 hierakiske tabeller som skal joines) og så er der hele performancen...
Aggregate function må være vejen frem - men kan man lave IF ... ELSE med noget count eller endnu bedre noget SWITCH i sådan en? Jeg forestiller mig at kalde funktionen noget a'la STRSUM() - og så kalde den med mit ordreid - herefter tælle antallet af ordrelinjer. returnere null for 0 linjer, returne teksten for 1 og endelig min faste tekst for 2.
Så er det jo ikke længere en Aggregate funktion ... hvis den modtager en ting, og returnere en helt anden ... eller jo ... men den bliver vel super slow, hvis du skal lave en DB kald for hver gang STRSUM bliver kaldt ....
Men løser den da ikke dit problem ?
Synes godt om
Slettet bruger
27. maj 2008 - 21:31#8
Jooh - til dels løser den det, men jeg vil lige fumle mig lidt frem med det.
helt kalrt ... du siger bare til hvis der er mere ...
// ouT
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.