Avatar billede faithless Praktikant
09. august 2011 - 08:45 Der er 9 kommentarer og
1 løsning

Forkert beregning i et View på View

Hej

Jeg har lavet et view, lad os kalde det view 1 og det virker precist som det skal.

SELECT TOP 100 PERCENT F0101 AS HHNR, F0116 AS uge, F0113 AS Shop, SUM(F0104) AS [Value], SUM(F0122) AS Volume, SUM(F0133) AS Antal,
F0136 AS Ean
FROM  dbo.CT_data
WHERE (Dato >= '06-05-2011') AND (F0117 <> 89) AND (F0136 IS NOT NULL)
GROUP BY F0101, F0116, F0113, F0133, F0104, F0136

På resultatet af View 1, skal jeg så lave endnu et view, lad os kalde det view 2.

SELECT TOP 100 PERCENT Ean, uge, Shop, CONVERT(float, SUM(CONVERT(float, [Value]) / CONVERT(float, Volume))) AS EnhedsPris, COUNT(Ean) AS Handlinger
FROM  dbo.vi_HHNRean
GROUP BY Ean, uge, Shop

Men problemet er, at jeg i view 2 får et forkert resultat for enkelte records for SUM beregningen. Jeg bruger convert og float for at få decimaler på tallene i viewet, da det ellers kun var heltal.

Databasen er på 12 millioner rekords, men view 1's where afgrænser det til ca 40.000 rekords. Kan det være noget med at den laver beregningerne i view 2 uden først at være færdig med at køre view 1, eller er det noget i min sum formel. Det er en MS SQL 2000 server, der køres på.

Håber i kan hjælpe.

Mvh
Thomas
Avatar billede erikjacobsen Ekspert
09. august 2011 - 09:39 #1
Jeg skal indrømme, at jeg gætter. Jeg kan ikke se hvad der er galt. Men udgangspunktet er, at det næppe er MSSQL2000, der regner galt.

Det jeg ikke lige forstår, er hvorfor du laver den udregning, som du gør. Lad os sige at du for en given ean-uge-shop har disse værdier

Value  Volume
100      2
200      5

Enhedsprisen for første række er så 50, og for anden række 40. Disse to tal lægger du sammen, så det bliver 90 - men det ligner ikke en "enhedspris".

.....eller også har jeg misforstået noget ;)
Avatar billede janus_007 Nybegynder
09. august 2011 - 09:42 #2
Datatypen float er tilnærmelsesvise/ omtrentlige, så måske fejlen ligger heri. Nu har jeg ingen mulighed for at inspicere dine data så det er svært lige at sige.

Lav datatypen om til decimal med høj precision og prøv igen :)

Jeg kan forresten ikke se nogen relation imellem dine 2 views, er du sikker på du har postet de rigtige?
Avatar billede faithless Praktikant
09. august 2011 - 10:23 #3
Dette er et lille udtræk fra resultatet af view 1.

    Value    Volume       
    650    1000       
    650    1000       
    650    1000       
    1300    2000       
    1300    2000       
    1300    2000       
    650    1000       
    650    1000       
    1300    2000       
    650    1000       
    650    1000       
    650    1000       
    650    1000       
    650    1000       
    1300    2000       
    1300    2000       
    1300    2000       
               
Sum    15600    24000    Resultat    0,650

Jeg ville gerne ha resultatet på 0,65, men får i stedet resultatet 11,05 for view 2. Så du er inde på det rigtige ErikJacobsen, at det skyldes den beregner hver rekord og summere resultatet. Hvordan får jeg den til at lave beregningen, som jeg ønsker det?
Avatar billede erikjacobsen Ekspert
09. august 2011 - 10:30 #4
Noget med (utestet)

CONVERT(float, SUM(CONVERT(float, [Value])) / SUM(CONVERT(float, Volume))) AS EnhedsPris,
Avatar billede faithless Praktikant
09. august 2011 - 10:36 #5
Prøver lige din også Erik, men tror også at den neden for giver mig det rigtige resultat. Men smid et svar Erik, så jeg kan lukke og du kan få point. Tak for hjælpen.

CONVERT(float, SUM(CONVERT(float, [Value]) / CONVERT(float, Volume)) / COUNT(Ean)) AS EnhedsPris
Avatar billede faithless Praktikant
09. august 2011 - 10:48 #6
De gav precist samme resultat, men kunne bedst lide din erik, så den har jeg brugt (c:
Avatar billede erikjacobsen Ekspert
09. august 2011 - 11:34 #7
Hmm, jeg kan ikke helt greje om det nu giver det samme.

Med mit tidligere eksempel

Value  Volume
100      2
200      5

Det giver 300 i sum af value og 7 i sum af volume. 300 / 7 er ca. 43

Men i #5 regner du (40+50) / 2  =  45
Avatar billede faithless Praktikant
12. august 2011 - 14:54 #8
Jeg endte med at bruge din erik, så smid et svar så jeg kan lukke.

Tak for hjælpen
Avatar billede faithless Praktikant
08. september 2011 - 08:51 #9
Erik gider du ikke smide et svar, så jeg kan lukke. Får en reminder mail fra eksperten, fordi det er åbent.
Avatar billede faithless Praktikant
23. september 2011 - 06:54 #10
lukker det nu, skriv hvis du ønsker point erik.
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