Probleme mit der SUM() -Funktion in SQL

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von HerrFrie.

    Probleme mit der SUM() -Funktion in SQL

    Werte Leute des VB-Paradise Forums,

    ich hab Probleme mit einer SQL Abfrage in Verbingung mit dem Readerobjekt. Mein Sytax ist wie folgt (alles Notwendige wurde mit Import eingebunden):

    VB.NET-Quellcode

    1. [....]
    2. Dim MON As String
    3. Dim monat As String
    4. Dim con As New OleDbConnection
    5. Dim cmd As New OleDbCommand
    6. Dim reader As OleDbDataReader
    7. Dim wert, wert_bezahlt, wert_offen As Double
    8. con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=C:\Temp\firma.accdb"
    9. cmd.Connection = con
    10. cmd.CommandText = "SELECT Sum([betrag]) as betrag from personen"
    11. Try
    12. con.Open()
    13. reader = cmd.ExecuteReader()
    14. Do While reader.Read()
    15. wert = reader("betrag")
    16. Loop
    17. reader.Close()
    18. reader = cmd.ExecuteReader()
    19. cmd.CommandText = "SELECT SUM([betrag]) as betrag FROM personen WHERE status = 'bezahlt'"
    20. Do While reader.Read()
    21. wert_bezahlt = reader("betrag")
    22. Loop
    23. reader.Close()
    24. reader = cmd.ExecuteReader()
    25. cmd.CommandText = "SELECT SUM([betrag]) AS betrag FROM personen WHERE status = 'unbezahlt'"
    26. Do While reader.Read()
    27. wert_offen = reader("betrag")
    28. Loop
    29. reader.Close()
    30. con.Close()
    31. Catch ex As Exception
    32. MessageBox.Show(ex.Message)
    33. End Try
    34. MON = ComboBox1.SelectedItem
    35. Select Case MON
    36. Case "jan"
    37. monat = "Januar"
    38. Case "feb"
    39. monat = "Februar"
    40. Case "mar"
    41. monat = "März"
    42. Case "apr"
    43. monat = "April"
    44. Case "mai"
    45. monat = "Mai"
    46. Case "jun"
    47. monat = "Juni"
    48. Case "jul"
    49. monat = "Juli"
    50. Case "aug"
    51. monat = "August"
    52. Case "sep"
    53. monat = "September"
    54. Case "okt"
    55. monat = "Oktober"
    56. Case "nov"
    57. monat = "November"
    58. Case "dez"
    59. monat = "Dezember"
    60. End Select
    61. Chart1.Series.Clear()
    62. Chart1.Series.Add(monat)
    63. Chart1.Series.Add("bezahlt")
    64. Chart1.Series.Add("offen")
    65. Chart1.Series(monat).ChartType = DataVisualization.Charting.SeriesChartType.Column
    66. Chart1.Series("bezahlt").ChartType = DataVisualization.Charting.SeriesChartType.Column
    67. Chart1.Series("offen").ChartType = DataVisualization.Charting.SeriesChartType.Column
    68. 'Werte
    69. Chart1.Series(monat).Points.AddY(wert)
    70. Chart1.Series("bezahlt").Points.AddY(wert_bezahlt)
    71. Chart1.Series("offen").Points.AddY(wert_offen)
    72. Chart1.Series(monat).IsValueShownAsLabel = True
    73. Chart1.Series("bezahlt").IsValueShownAsLabel = True
    74. Chart1.Series("offen").IsValueShownAsLabel = True
    75. End Sub


    Der Inhalt der Spalte Betrag un der Spalte Status in der Tabelle personen ist wie folgt:

    Betrag Status
    365 bezahlt
    2000 unbezahlt
    500 unbezahlt
    50 unbezahlt
    50 unbezahlt


    Somit müsste wert_bezahlt =365 ; wert =2965 ; wert_offen=2600 sein
    Ausgabe ist aber: wert=2965 ; wert_bezahlt=2965 wert_offen=365 !!

    Weiß jemand Rat? Es muss irgendwie am SQL-Aufruf liegen...

    Vielen Dank im Voraus!
    Gruß
    Timo
    Hi,

    als erstes kannst du den Reader für solche Abfragen, wo du nur einen Wert zurück geben willst weglassen.
    Du kannst den Befehl einfach so an die Datenbank schießen:

    VB.NET-Quellcode

    1. wert_bezahlt = cmd.ExecuteScalar


    Wenn du solche Summierung machst, brauchst du glaube ich die 'GROUB BY' mit im SQL Befehle, da sonst alles zusammen gerechnet wird, wie es bei dir der Fall ist.
    Probier mal :

    VB.NET-Quellcode

    1. cmd.CommandText = "SELECT SUM([betrag]) as betrag FROM personen WHERE status = 'bezahlt' GROUB BY personen"
    2. cmd.CommandText = "SELECT SUM([betrag]) AS betrag FROM personen WHERE status = 'unbezahlt GROUB BY personen'"
    @TE

    Du weisst bei der 2. und 3. Abfrage nach dem Execute erst den neuen SQL zu. :)
    Funktioniert anders rum besser.

    @HerrFrie

    Glauben heisst nicht wissen. :)

    Denk mal drüber nach was bei deiner Abfrage mit group by Personen rauskommt.

    Na?
    Eine Summe der Beträge pro Person, was nicht im Sinne des TE wäre.

    LG
    Katmay
    Ok,

    wird Zeit das Wochenende wird, GROUP BY wird da ja gar nicht benötigt.

    Allerdings brauchst du wie gesagt die Reader nicht, da du das einfach mit einer Zeile lösen kannst und den Befehl wie im ersten Code von Post 2 schreiben kannst.
    Spart Code und sieht übersichlicher aus.

    PS: Du kannst den Thread als Closed selber markieren, gibts einen Button für ;)