Frage zum Addieren von Tabellen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Frage zum Addieren von Tabellen

    Hey ihr,

    Hab da mal eine Frage.
    Habe im Server Explorer verschiedene Tabellen erstellt.
    Eine sieht ca. so aus:

    Produkt Punkte1 Punkte2 Punkte3

    asdf 67 74 83

    abad 51 92 62

    In einer anderen Tabelle habe ich eine Spalte mit Gesamt.
    Dort soll die Summer der Zahl in Punkte1, Punkte2 und Punkte3 stehen.
    Meine Frage: Wie mache ich das, dass diese Felder zusammengezählt werden?

    Bitte in einer Schritt für Schritt Anleitung.
    Ich nehme an ich kann das mit "gespeicherten Prozeduren" irgendwie lösen.
    Nur fehlt leider der Ansatz - oder eigentlich alles :(

    Noch lieber wäre es mir, wenn ich neben der Spalte mit Punkte3 die Gesamt spalte hätte.
    Allerdings habe ich da leider auch keine Ahnung wie dies Funktioniert.
    In Access bekomme ich das alles hin nur in VB nicht.

    Danke!!
    Sorry ... aber das muss jetzt sein ... AUA! ;)

    Bitte, tritt alles in die Tonne das ist der völlig falsche Aufbau.

    Gründe:

    1. Fields ala Punkte1, Punkte2, Punkte3 etc. ... sind ein absolutes NoGo.

    Richtig ist es wenn Du eine Tabelle hast in dem die Produkte stehen und dazu über eine 1:n Beziehung ein zweite Tabelle einrichtest die die Punkte zu dem Produkt aufnimmt.

    Also quasi so:

    tblProdukte

    <ProduktID >
    abcd
    abad
    ... usw.

    tblPunkte
    <ProduktID>|<Punktebezeichnung>|<Punktezahl>
    abcd | Punkte1 | 67
    abcd | Punkte2 | 74
    abcd | Punkte3 | 83
    abad | Punkte1 | 51
    abad | Punkte2 | 92
    abad | Punkte3 | 62
    .. usw.

    2. Berechnete Felder wie GesamtSummen, Alter o.ä. werden NIEMALS in einer DB gespeichert

    Richtig ist es sich für sowas Views (nicht stored Procedures) anzulegen. Z.B. eine View mit dem folgenden SQL-Statement:

    [MySQL]
    SELECT Sum(Punktezahl), ProduktID FROM tblPunkte Group By ProduktID[/QUOTE]

    liefert Dir immer die aktuelle Gesamtpunkte-Zahl aller Artikel. Und auf die kannste dann zugreifen wenn Du die Punkte abfragen willst.

    Gruß

    Rainer
    Danke für die Hilfe!!
    In Access hat es halt so auch geklappt :S Man möchte mir vergeben.
    Ok das mit dem View habe ich schon ausprobiert.
    Das sieht dann so aus (hoffe es ist richtig so):

    VB.NET-Quellcode

    1. SELECT dbo.[Erstes Semester].Test1, dbo.[Erstes Semester].Test2, dbo.[Erstes Semester].Test3, dbo.Gesamt.Gesamt, dbo.[Erstes Semester].Erreichbar1,
    2. dbo.[Erstes Semester].Erreichbar2, dbo.[Erstes Semester].Erreichbar3, dbo.Gesamt.GesamtErreichbar
    3. FROM dbo.[Erstes Semester] INNER JOIN
    4. dbo.Gesamt ON dbo.[Erstes Semester].ID = dbo.Gesamt.ID AND
    5. dbo.[Erstes Semester].Test1 + dbo.[Erstes Semester].Test2 + dbo.[Erstes Semester].Test3 = dbo.Gesamt.Gesamt AND
    6. dbo.[Erstes Semester].Erreichbar1 + dbo.[Erstes Semester].Erreichbar2 + dbo.[Erstes Semester].Erreichbar3 = dbo.Gesamt.GesamtErreichbar


    Allerdings wird dann nichts in meiner Tabelle angezeigt wenn ich es in meine Windows-Forms-Anwendung einbauen will.
    Das DataGrid bleibt einfach leer.

    Was könnte da falsch sein und stimmt das View so?

    DANKE

    In Access hat es halt so auch geklappt :S Man möchte mir vergeben.


    Nur weil etwas klappt heisst es noch lange nicht das es richtig ist. In der Programmierung führen viele Wege nach Rom, aber noch mehr Wege die am Anfang nur so aussehen als wenn sie nach Rom führen würden.

    Manche entpuppen sich erst kurz vorm Ziel als Sackgasse. ;)

    Ob Dein SQL-Statement so stimmt kann ich schwer sagen ohne die Tabellenstruktur zu kennen, aber was mir auffällt:

    1. Du hast ja immer noch den Bullc.rap mit Field1, Field2, Field3 drinnen. ^^
    2. Nachdem INNER JOIN folgen sofort weitere Kriterien was nicht funktionieren kann da die Field Verknüpfung im ON sich auf die ID-Fields bezieht und die vermutlich nicht aus mehreren Fields zusammen gesetzt sind.

    Denke es müsste so heissen: ... ON dbo.[Erstes Semester].ID = dbo.Gesamt.ID WHERE dbo.[Erstes Semester].Test1 + dbo.[Erstes Semester].Test2 + dbo.[Erstes Semester].Test3 = dbo.Gesamt.Gesamt ...

    3. Wenn Du meinem Vorschlag gefolgt wärst die Tabellenstruktur zu ändern dann würde das SQL-Statement dafür auf den ersten Blick "falsch" aussehen

    Gruß

    Rainer
    Also so hatten es wir in Access in der Schule gelernt.
    Aber Lehrer wissen auch nicht immer alles^^

    Nun habe das ganze jetzt anders Probiert.
    So müsste es doch auch funktionieren oder?

    VB.NET-Quellcode

    1. SELECT SUM(Test1) AS summa
    2. FROM [Erstes Semester]


    Das funktioniert aber nur für eine Spalte.
    Kann man auch in der Zeile addieren?
    Nur wie gebe ich dies dann in einer anderen Tabelle aus?
    Funktioniert das so?

    VB.NET-Quellcode

    1. SELECT SUM([Erstes Semester].Test1) AS summa
    2. FROM [Erstes Semester] INNER JOIN
    3. Gesamt ON [Erstes Semester].ID = Gesamt.ID AND [Erstes Semester].Test1 = Gesamt.Gesamt


    Allerdings wird in der anderen Tabelle nichts ausgeben.

    DANKE

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BliZzard7987“ ()

    BliZzard7987 schrieb:

    Also so hatten es wir in Access in der Schule gelernt.
    Aber Lehrer wissen auch nicht immer alles^^


    Solche elementaren Grundregeln im Datenbank-Designs sollte ein Lehrer mindestens beherrschen ansonsten ist er auf der Position völlig untauglich.


    Nun habe das ganze jetzt anders Probiert.
    So müsste es doch auch funktionieren oder?

    VB.NET-Quellcode

    1. SELECT SUM(Test1) AS summa
    2. FROM [Erstes Semester]


    Das funktioniert aber nur für eine Spalte.


    Natürlich funktioniert Sum nur für eine Spalte. Und jetzt guckste Dir mal meinen ersten Post in diesem Thread an und Dir wird es jetzt hoffentlich wie Schuppen von den Augen fallen ... mein Ansatz basiert darauf das ALLE Punkte eben in einer Spalte stehen. Und es auch mit ein Grund wieso man NIE NIE NIE in einer Datenbank gleichartige Werte in unterschiedliche Spalten schreibt.


    Kann man auch in der Zeile addieren?


    Kann man.

    Aber dabei den Bullc.rap mit Field1, Field2, Field3 etc. aufzulösen helfe ich Dir eh nicht. Einfach weil es kompletter Unsinn wäre auf so einem verkorksten und untauglichem Datenbankdesign weiter zu arbeiten. Das taugt wirklich nur für die Tonne.

    Sollte Dir eigentlich am obigen Beispiel klar werden, machst Du es richtig so wie ich vorgeschlagen haben dann kannst Du wunderbar einfach mit Sum arbeiten und all Deine Abfrage-Probleme sind gelöst.

    Gruß

    Rainer
    Eine kleine Frage noch.
    Hab jetzt alles überarbeitet und funktioniert einwandfrei.
    Ich weiß das man mit "/" oder "DIV" werte dividieren kann und mit "*" multiplizieren.
    Allerdings funktioniert das mit den Summen der Spalten irgendwie nicht.

    Aussehen sollte das Ganze so: Gesamt1/Erreichbar1*100 = Prozent1
    Habe es auch schon mit "ABS()" probiert, funktioniert aber auch nicht.
    Gesamt1 und Erreichbar1 wurde vorher mit SUM erstellt.

    Sind meine Argumente irgendwie falsch oder kann man generell nicht aus einer Summe einer Spalte dividieren?

    Danke.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BliZzard7987“ ()

    BliZzard7987 schrieb:

    Sind meine Argumente irgendwie falsch oder kann man generell nicht aus einer Summe einer Spalte dividieren?

    Mir drängt sich der Verdacht auf, du wollest berechnete Werte abspeichern.
    sowas sind sog. Prozesswerte, und haben in einer Datenbank nix verloren.
    Derlei berechnungen sind üblicherweise im Programm auszuführen, jeweils neu, wenn werte abgerufen werden.