Avatar billede svjensen Nybegynder
11. oktober 2010 - 16:40 Der er 6 kommentarer

Formattering af tal i SQL

Mit spørgsmål går på formattering af tal direkte i SQL.

Hvis jeg vha. QBE laver en forespørgsel, der henter nogle tal for en tabel (fx tblTest.Tal), så vises de højrestillet med det antal decimaler, der nu en gang er i tallet.

Hvis jeg så vælger at få det formatteret som 'Standard', så vises de højrestillet, med to decimaler og tusindtalsseparator.

Hvordan kan jeg opnå det samme direkte i SQL?
Jeg har forsøgt mig med 'Format(tblTest.Tal, "Standard")' og 'FormatNumber(tblTest.Tal)'. Begge dele håndterer de to decimaler og tusindtalsseparatorerne fint, men returnerer værdierne venstrestillet. Hvordan kan jeg tvinge højrestilling af tallene igennem?

/Søren
Avatar billede terry Ekspert
11. oktober 2010 - 19:05 #1
SELECT CDbl(Format([someNumber];"Standard")) As StandardFormat
Avatar billede svjensen Nybegynder
12. oktober 2010 - 07:38 #2
Det virker fint på relativt simple forespørgsler, men jeg får følgende fejlmeddelelse på min:

"Dette udtryk er stavet forkert, eller det erfor komplekst til at blive evalueret. Et numerisk udtrk kan f.eks. indeholde for mange komplicerede elementer. Prøv at forenkle udtrykket ved at tildele variabler dele af udtrykket."

Min forespørgsel ser således ud:
TRANSFORM CDbl(Format(Sum([Normer]*[Kvante]), "Standard")) AS Loen SELECT tblBCListe.uid, tblFunktionsniveauer.Type FROM tblNivII INNER JOIN ((tblBCListe INNER JOIN (tbl1aFaner INNER JOIN (tblFunktionsniveauer INNER JOIN tbl1aNormer ON tblFunktionsniveauer.uid=tbl1aNormer.FunkNiveauId) ON tbl1aFaner.uid=tbl1aNormer.FaneId) ON tblBCListe.uid=tbl1aFaner.BCId) INNER JOIN tblLoenkvanter ON tblFunktionsniveauer.uid=tblLoenkvanter.FunkNiveauId) ON (tblNivII.uid=tblLoenkvanter.NivIIId) AND (tblNivII.uid=tbl1aFaner.NIVIIId) WHERE (((tblBCListe.uid)=[txtUID]) AND ((tbl1aFaner.DatoSat)<Now()) AND ((tbl1aFaner.DatoUdloeb)>Now()) AND ((tbl1aNormer.DatoSat)<Now()) AND ((tbl1aNormer.DatoUdloeb)>Now())) GROUP BY tblBCListe.uid, tblFunktionsniveauer.Type PIVOT tbl1aNormer.Year In ("2010","2011","2012","2013","2014","2015","2016","2017","2018","2019","2020","2021","2022","2023","2024");

Jeg tænker, at problemet opstår fordi, jeg inde i 'CDbl()' har en aggregering...?

/Søren
Avatar billede terry Ekspert
12. oktober 2010 - 13:31 #3
I would try making a query which first selects and converts your fields then use the query in your SQL
Avatar billede Slettet bruger
13. oktober 2010 - 21:57 #4
format og alle andre muligheder, så vidt jeg ved, for at lave et udtryk med tusind seperator, bliver til et udtryk af typen: string.
højrejustering foregår med venste padding med space, baseret på max string længde for hele 'recordsættet'.
Hvis f.eks len(str(max(<talfelt>))) er 20, så vil følgende felt udtryk gøre det:

string(20-len(format([feltnavn],"standard"))," ") & _ format([feltnavn],"standard")

Der bør laves en vba funktion for at undgå dobbeltberegninger (og max query for hver eneste record)

Hvorfor er det overhovedet ønskeligt at dette skal laves i sql? Er det ikke godt nok at disse præsentionsting laves i anvendelsen af  forespørselen?
Avatar billede svjensen Nybegynder
28. oktober 2010 - 21:58 #5
Har nu forsøgt at oprette en forespørgsel, som jeg anvender som rækkekilde til min liste.
Men jeg får samme resultat. Værdierne er venstrestillede.

Hvis jeg forsøger med CDbl() i forespørgslen, så får jeg samme fejlmeddelelse, som når jeg forsøger, at gøre det direkte i min SQL sætning.

Har jeg fået galt fat i jeres forslag?
Avatar billede terry Ekspert
30. oktober 2010 - 10:04 #6
"Har jeg fået galt fat i jeres forslag?"

Hard to say as we cant see your data/SQL.
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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