Avatar billede steensommer Praktikant
16. februar 2008 - 20:03 Der er 55 kommentarer og
1 løsning

Gennemsnitsalder i VB .Net

Hej

Jeg skal lave lidt statistik fra vores SQL database.
Bl.a jeg jeg finde gennemsnitsalderen for at antal personer:
Jeg kan lave en søgning i en SQL database der lister personernes alder - men jeg vil ha' det ind i VB .NET:

SELECT DATEDIFF(year, Fødselsdato, [Op# dato])

Antal personer i databasen i et givet årstal findes i databasen ved:

SELECT Count(*) from HCV WHERE Årstal = ('" & Årstal & "')

Jeg vil herefter gerne finde peronerne gennemsnitsalder med én decimal og det kan jeg ikke engang finde ud af at lave i en SQL forespørgsel - HJÆLP!!!

Jeg håber at ovenstående er forståeligt :-)
Avatar billede nielle Nybegynder
16. februar 2008 - 20:10 #1
Du kan beregne gennemsnitsalderen direkte i SQL sætningen ved at modificere den lidt:

SELECT Avg(DATEDIFF(year, Fødselsdato, [Op# dato])) AS gennemSnit
Avatar billede steensommer Praktikant
16. februar 2008 - 20:34 #2
Hej nielle

Hvor kom gennemSnit fra - den kender jeg ikke.
Avatar billede nielle Nybegynder
16. februar 2008 - 20:38 #3
Gennemsnittet beregnes via Avg() funktionen - Avg = Average = Gennemsnit.

"gennemSnit" kommer ikke nogen steder fra ... med AS kommandoen opretter jeg et alias for det tal der kommer ud som resultat af Avg(). Det alias har jeg kaldt gennemSnit, men du kunne kalde det noget andet hvis du ønsker.

Aliaset betyder bare at det ser ud som om at der er kommet et gennemSnit-felt i dit resultat og at det er der du har værdien.
Avatar billede steensommer Praktikant
16. februar 2008 - 20:41 #4
Der er en eller anden fejl i nedenstående (fejler ved FROM) - kan du gennemskue det?

                Dim Command1 As New SqlCommand("SELECT AVG(DATEDIFF(year, Fødselsdato, [Op# dato])) as GennemSnit) FROM HCV", Connection)
                Dim reader1 As SqlDataReader = Command1.ExecuteReader()
                If reader.Read() Then
                    Statistik = reader.GetInt32(0)
                    MsgBox(Statistik)
                End If
Avatar billede nielle Nybegynder
16. februar 2008 - 20:44 #5
Hvislken fejlbesked giver den?
Avatar billede nielle Nybegynder
16. februar 2008 - 20:46 #6
Du kar ighvertfald en ')' for meget lige efter GennemSnit.
Avatar billede steensommer Praktikant
16. februar 2008 - 20:46 #7
Line 1: Incorrect syntax near ')'.
Avatar billede steensommer Praktikant
16. februar 2008 - 20:49 #8
Hmm - der smutter let lidt forkert ind :-/
Jeg tror at vi nærmer os. Jeg kunne dog godt tænke mig at få tallet med 1 decimal!
Avatar billede nielle Nybegynder
16. februar 2008 - 20:56 #9
Måske sådan?

Math.Round(ditTal, 1)
Avatar billede steensommer Praktikant
16. februar 2008 - 20:58 #10
...øh hvordan skal den placeres i sætningen?
Avatar billede nielle Nybegynder
16. februar 2008 - 21:05 #11
MsgBox(Math.Round(Statistik, 1))
Avatar billede nielle Nybegynder
16. februar 2008 - 21:06 #12
Din statistik skal du ikke hente ud med en:

Statistik = reader.GetInt32(0)

du skal hente den ud med noget som returnere et flat i stedet for et heltal.
Avatar billede nielle Nybegynder
16. februar 2008 - 21:07 #13
flat -> float
Avatar billede nielle Nybegynder
16. februar 2008 - 21:08 #14
Når at den nu har fået aliaset GennemSnit så bør vi bruge det i stedet for:

Statistik = reader.GetInt32(0)

rettes til:

Statistik = Floar.Parse(reader("GennemSnit"))
Avatar billede nielle Nybegynder
16. februar 2008 - 21:09 #15
Doubler i stedet for Float
Avatar billede steensommer Praktikant
16. februar 2008 - 21:33 #16
Der er forsat ikke decimal med
Avatar billede nielle Nybegynder
16. februar 2008 - 21:35 #17
Hvordan ser din kode ud?
Avatar billede steensommer Praktikant
16. februar 2008 - 21:43 #18
Dim Command1 As New SqlCommand("SELECT AVG(DATEDIFF(year, Fødselsdato, [Op# dato])) as GennemSnit FROM HCV WHERE Årstal = ('" & Årstal & "')", Connection)
                Dim reader1 As SqlDataReader = Command1.ExecuteReader()
                If reader1.Read() Then
                    Statistik = Double.Parse(reader1("GennemSnit"))
                    MsgBox(Statistik)
                End If
Avatar billede nielle Nybegynder
16. februar 2008 - 21:44 #19
Hvordan har du Dim'et din Statestik variabel?
Avatar billede steensommer Praktikant
16. februar 2008 - 21:46 #20
Dim Statistik As String = ComboBox2.Text
Avatar billede nielle Nybegynder
16. februar 2008 - 21:47 #21
Den skal være Dim'et som en Double.
Avatar billede steensommer Praktikant
16. februar 2008 - 21:59 #22
Det gjorde ingen forskel :-(
Avatar billede nielle Nybegynder
16. februar 2008 - 22:03 #23
Hvad skal gennemsnittet være hvis du regner det ud i hånden?
Avatar billede steensommer Praktikant
16. februar 2008 - 22:05 #24
Det er altså en RET stor beregning så det aner jeg ikke - men eksempelvis 65,8
Avatar billede nielle Nybegynder
16. februar 2008 - 22:11 #25
Hvad får du hvis du kobler op imod databasen direkte med Micrisoft SQL Server Management Studio og udføre SQL-kaldet der?
Avatar billede steensommer Praktikant
16. februar 2008 - 22:13 #26
Uden decimal
Avatar billede nielle Nybegynder
16. februar 2008 - 22:15 #27
Men så er resultatet vel uden decimal?
Avatar billede steensommer Praktikant
16. februar 2008 - 22:18 #28
...nej det er helt klart med decimal - resultatet skal være et gennemsnit af flere hundrede personers alder - det bliver logisk set IKKE et tal UDEN decimal!
Avatar billede nielle Nybegynder
16. februar 2008 - 22:27 #29
Der er absolut intet *logisk* i vejen for at det faktisk kan være et tilfælde hvor at gennemsnitettet er et helt tal. Hvorvidt at det er *sandsynligt* afhænger helt af talmaterialet.

Hvad gemmer der sig bag feltet Årstal? Hvad er det for nogle personeer der udtrækkes når du skriver:

... WHERE Årstal = ('" & Årstal & "')"

?
Avatar billede steensommer Praktikant
16. februar 2008 - 22:32 #30
Det er bare de registrede personer i en specifik årgang: eksempelvis 2004
Avatar billede steensommer Praktikant
16. februar 2008 - 22:35 #31
Er problemet at AVG afrunder?
Avatar billede nielle Nybegynder
16. februar 2008 - 22:43 #32
AVG afrunder ikke ... det ville ligesom være i modstrid med dens formål.
Avatar billede nielle Nybegynder
16. februar 2008 - 22:44 #33
Er der ikke en vis sandsynlighed for at folk i en specifik årgang har nogenlunde samme alder?
Avatar billede steensommer Praktikant
16. februar 2008 - 22:46 #34
54+65+34+24 gennemsnit 44,25
Avatar billede steensommer Praktikant
16. februar 2008 - 22:49 #35
Årgangen har intet med deres alder at gøre - det er blot det år hvor vi havde kontakt med dem
Avatar billede nielle Nybegynder
16. februar 2008 - 22:51 #36
16/02-2008 22:46:14 > Hvad er det for nogle tal du har trukket frem der?
Avatar billede steensommer Praktikant
16. februar 2008 - 22:54 #37
Tilfældige aldre på personer der er i registeret og hveis gennemsnit IKKE er et rundt tal!
Avatar billede nielle Nybegynder
16. februar 2008 - 22:59 #38
Beviser det noget? Jeg kan da også sammensætte en serie af forskellige aldre og hvor gennemsnittet er et helt tal selv om man ikke lige tror det ved første øjekast. MJen beviser det noget?

Pointen er at der intet logisk i vejen for at resultatet faktisk mkunen være et helt tal. Hvorvidt det er sandsynligt er en anden sag. :^)

Men man kan altås ikke kigge på en masse tal mog sige det bliver ikeke t heltal.
Avatar billede steensommer Praktikant
16. februar 2008 - 23:02 #39
ALTSÅ - du er nødt til at tro mig! Tallet bliver ikke helt! Det er muligt at jeg er en nocive i VB .net men jeg er IKKE en idiot!
Avatar billede nielle Nybegynder
16. februar 2008 - 23:03 #40
Hvis resultatet giver et helt tal i MS SMSS så er det sandsynligvis fordi at det faktisk er et heltal. Prøv med nogle forskellige års tal.

... eller prøv med denne:

SELECT Årstal, AVG(DATEDIFF(year, Fødselsdato, [Op# dato])) as GennemSnit
FROM HCV
GROUP BY Årstal

- og se hvad den giver.
Avatar billede steensommer Praktikant
16. februar 2008 - 23:04 #41
Diskussionen er lidt afsporet! Det handler vel om at får SQL forespørgslen til at give et tal med en decimal og IKKE om tallet er HELT
Avatar billede nielle Nybegynder
16. februar 2008 - 23:05 #42
Jeg påstår på ingen måder at du skulle være en idiot (og, det har jeg ingen grund til at tro at du skulle være!) - jeg påpegede såmæn bare at 16/02-2008 22:46:14 på ingen måde var et brugbart argument for at det ikke kunne være et heltal. :^)
Avatar billede nielle Nybegynder
16. februar 2008 - 23:06 #43
Prøv nu bare den der 16/02-2008 23:03:06 i din MS SMSS
Avatar billede nielle Nybegynder
16. februar 2008 - 23:07 #44
AVG() skal skam automatisk returnere et decimaltal.
Avatar billede steensommer Praktikant
16. februar 2008 - 23:08 #45
Det giver selvfølgelig OGSÅ heltal men resultatet SKAL bruges til en opgørelse der KRÆVER EN decimal og det kan jeg ikke bare ignorere
Avatar billede steensommer Praktikant
16. februar 2008 - 23:09 #46
Det er muligt at AVG kan returnere en decimal men så må fejlen jo ligge et andet sted!
Avatar billede nielle Nybegynder
16. februar 2008 - 23:15 #47
Du kan jo prøve med denne variation:

Dim Command1 As New SqlCommand("SELECT AVG(CAST(DATEDIFF(year, Fødselsdato, [Op# dato])) AS FLOAT) AS GennemSnit FROM HCV WHERE Årstal = '" & Årstal & "'", Connection)
Avatar billede steensommer Praktikant
16. februar 2008 - 23:18 #48
Jeg har prøvet direkte i SQL databasen men der opstår en fejl (jeg har faktisk lige rodet lidt med CAST men kunne ikke få det til at virke): Incorrect syntax near CAST expected AS
Avatar billede nielle Nybegynder
16. februar 2008 - 23:20 #49
Det var nu også mig som rodede med parenteserne denne gang:

Dim Command1 As New SqlCommand("SELECT AVG(CAST(DATEDIFF(year, Fødselsdato, [Op# dato]) AS FLOAT)) AS GennemSnit FROM HCV WHERE Årstal = '" & Årstal & "'", Connection)
Avatar billede steensommer Praktikant
16. februar 2008 - 23:20 #50
Den her kom med MANGE decimaler:
SELECT    AVG(CAST(DATEDIFF(year, Fødselsdato, [Op# dato]) AS FLOAT)) AS GennemSnit
FROM        dbo.HCV
Avatar billede nielle Nybegynder
16. februar 2008 - 23:22 #51
Afrundningen til 1 decimal foregår ude i VB.Net koden med kodestumpen fra 16/02-2008 21:05:43
Avatar billede steensommer Praktikant
16. februar 2008 - 23:22 #52
Vi nåede vist det samme resultat
Avatar billede nielle Nybegynder
16. februar 2008 - 23:25 #53
Det kan dog også gøres direkte i SQL koden:

Dim Command1 As New SqlCommand("SELECT ROUND(AVG(CAST(DATEDIFF(year, Fødselsdato, [Op# dato]) AS FLOAT)), 1) AS GennemSnit FROM HCV WHERE Årstal = '" & Årstal & "'", Connection)
Avatar billede steensommer Praktikant
16. februar 2008 - 23:31 #54
Ved DU hvad neille - DER ramte du HELT rigtigt. PYH - godt stykke arbejde! Svar lig så du kan få dine velfortjente point OG en stor tak fra mig :-)
Avatar billede nielle Nybegynder
16. februar 2008 - 23:31 #55
Svar :^)
Avatar billede steensommer Praktikant
16. februar 2008 - 23:32 #56
....og TAK!
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
Kurser inden for grundlæggende programmering

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