Avatar billede mccookie Seniormester
08. februar 2021 - 14:55 Der er 4 kommentarer og
1 løsning

Udfordringer med valg af Nyeste post i et Cross Apply

Hej,

Jeg har lidt udfordringer med at trække en ønsket liste.... og har/havde måske en forventning om at TOP kunne hente den "nyeste" række pr. bruger.

select d.PkUserNumber, LastName, ds.PkDebTransaction, ds.UserBalance2, ds.starttime
from Users as d
cross apply
(select top 1  PkDebTransaction,starttime, UserBalance2 from DEBTransactions where d.PkUserNumber = FkUser and type = 12) as ds

Jeg fået et resultat med en linje pr. bruger, men hvor jeg havde forventet at få den nyeste post med typen 12, så får jeg i stedet den ældste post.

PkDebTransaction er min primær nøgle og jeg "synes" den skulle tage den post med den højeste id pr. bruger.
Avatar billede wjens Guru
08. februar 2021 - 16:34 #1
TOP tager den første af de records du select'er, men de er ikke sorteret. Sikkert derfor du får den ældste. Du må mangle en ORDER BY for at få det du vil.
Avatar billede mccookie Seniormester
08. februar 2021 - 22:55 #2
Yes - Det gjorde udslaget..... :-)

Jeg har forsøgt mig med en substring på starttime, da jeg kun ønsker de første 4 cifre, men den kommer med en fejlmelding ala....

select d.PkUserNumber, LastName, ds.PkDebTransaction, ds.UserBalance2, substring(ds.starttime,0,2), ds.type
from Users as d
cross apply
(select top 1  PkDebTransaction, substring(starttime,0,2), UserBalance2, Type from DEBTransactions where d.PkUserNumber = FkUser and type IN (3) order by EndTime desc) as ds



Msg 8155, Level 16, State 2, Line 52
No column name was specified for column 2 of 'ds'.
Msg 207, Level 16, State 1, Line 49
Invalid column name 'starttime'.
Avatar billede wjens Guru
09. februar 2021 - 09:31 #3
Ren gæt: prøv med "ds." foran starttime, som du har i første select.
Avatar billede wjens Guru
09. februar 2021 - 09:34 #4
Sorry, det må være "DEBTransactions." som er den tabel du søger i der skal foran.
Avatar billede mccookie Seniormester
09. februar 2021 - 15:30 #5
Løste det med at kalde det ekstra felt, og lave substrings i den

select d.PkUserNumber, LastName, ds.TID, ds.PkDebTransaction, ds.UserBalance2, ds.starttime, ds.type
from Users as d
cross apply
(select top 1  PkDebTransaction, starttime, substring(starttime,8,2) + '/' + substring(starttime,5,2) + '-' + substring(starttime,1,4) as TID, UserBalance2, Type from DEBTransactions where d.PkUserNumber = FkUser and type IN (3) order by EndTime desc) as ds
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester