[MsSql] Nummers in database transformeren..

Pagina: 1
Acties:

  • Blue-eagle
  • Registratie: September 2000
  • Niet online
Tja de titel zegt niet veel, ik wist niks beters te verzinnen ;)

Het probleem is als volgt:
Ik heb een database table (tblUser) met enkele duizenden users. Een kolom heeft een "credit" waarde waar normaal waarden in staan van 1 tot 50, het kan ook 60 of zelfs 200 of meer zijn maar dat komt niet veel voor (iedere credit wordt namelijk gekocht, men heeft over het algemeen niet honderden credits).

Nu heeft een werknemer bij de klant van ons alle waarden x 1000 gedaan om zo het proces waarvoor de credits gebruikt worden gratis te maken voor een maand. Nu is die maand voorbij en moeten we (ik) de waarden weer terug converteren.

Voorbeeld reeks: 22999, 19000, 2000, 999, 6000, 1997, etc.

22999 delen door 1000 is 22.999, voeg een "CEILING" toe aan de query en je krijgt 23. Zou je zeggen.. maar mijn MSSQL Enterprise Manager geeft aan dat dit 22 is.

Wat er moet gebeuren: het bestaande getal ophogen naar het eerste duizendtal, deze waarde door 1000 delen en die waarden opslaan in de database.

Ik krijg het niet voorelkaar met mijn huidige kennis.. De database blijft "vreemde" waarden terug geven:

29939 -> 29 (zou moeten zijn: 30)
22999 -> 22 (zou moeten zijn: 23)
18999 -> 18 (zou moeten zijn: 19)
1998 -> 1 (zou moeten zijn: 2)
999 -> 0 (zou moeten zijn: 1)

En het is niet consistent (anders zou ik gewoon +1 kunnen doen ofzo ;) ), want:

24000 -> 24 (is goed)
22000 -> 22 (ook goed)
20000 -> 20 (ook ok)

Kan iemand me vertellen hoe ik dit nu wel goed moet doen? De kolom is een INT met lengte "4". Converteren naar double leek me een goed plan maarja, dan blijkt een double niet te bestaan :? Moet ik een decimal gebruiken? Een float?

  • Lethalis
  • Registratie: April 2002
  • Niet online
CEILING(getal / 1000.00)

Zoiets?

Ask yourself if you are happy and then you cease to be.


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Tel eerst overal 500 bij op, en pas dan de procedure toe die je nu ook doet.

Siditamentis astuentis pactum.


  • Blue-eagle
  • Registratie: September 2000
  • Niet online
Ik was je net voor Varienaja :D Ik had iets soortgelijks gedaan:
ROUND((Credits - 1) / 1000, 0) + 1

De waarden lijken goed te zijn :)

  • Lethalis
  • Registratie: April 2002
  • Niet online
Blue-eagle schreef op donderdag 26 januari 2006 @ 10:57:
Ik was je net voor Varienaja :D Ik had iets soortgelijks gedaan:
ROUND((Credits - 1) / 1000, 0) + 1

De waarden lijken goed te zijn :)
Als je door 1000 deelt, dan wordt het automatisch omgezet in een integer.

3 / 2 is 1 in SQL. 3 / 2.0 = 1.5

;)

Ask yourself if you are happy and then you cease to be.


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 14-04 17:49
Geen bijdrage aan je oplossing maar eerlijk gezeg vind ik deze manier van "gratis maken" een beetje curieus... Wat als iemand meer dan 1000 credits heeft uitgegeven? Dan kunnen er al dingen mis gaan. Een boolean had beter geweest, of desnoods het stukje code dat credits afboekt uitcommentarieren.

[ Voor 3% gewijzigd door sig69 op 26-01-2006 11:11 ]

Roomba E5 te koop


  • Blue-eagle
  • Registratie: September 2000
  • Niet online
sig69 schreef op donderdag 26 januari 2006 @ 11:10:
Geen bijdrage aan je oplossing maar eerlijk gezeg vind ik deze manier van "gratis maken" een beetje curieus... Wat als iemand meer dan 1000 credits heeft uitgegeven? Dan kunnen er al dingen mis gaan. Een boolean had beter geweest, of desnoods het stukje code dat credits afboekt uitcommentarieren.
I know, maar de klant heeft alles met nieuw jaar zelf lopen wijzigen via een back office (2000 user accounts, kost wel even wat tijd) zonder ons op de hoogte te stellen :(

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Je kan aan ROUND een negatieve waarde doorgeven:
SQL:
1
2
3
SELECT ROUND(22999, -3)

23000

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.

Pagina: 1