German SQL DB Doppelte Einträge ausschließen

strupp01

Active Member
Licensed User
Longtime User
Ich habe eine Datenbank 'Test' mit einer Tabelle 'Allgemein'. In dieser Tabelle sind hunderte Einträge.
Die Spalten sind 'Datum_Aufzeichnung', 'Uhrzeit', 'Druck' und 'Anschluesse'.
Ich möchte die Summe der Spalte 'Druck' in der Zeit von '170402' bis '170403' ermitteln.
Dies ist ja noch für mich möglich mit

Test = sql_SchlafGut.ExecQuerySingleResult("SELECT sum(Druck) FROM Allgemein where Datum_Aufzeichnung <= 170403 and Datum_Aufzeichnung >= 170402 order by Datum_Aufzeichnung ASC")

Das Ergebnis aus der beigefügten DB ist 14.
Da jedoch das Aufzeichnungs_Datum teilweise mehrfach in der Tabelle vorhanden ist, stimmt mein Ergebnis nicht. Es darf die Anzahl bei Druck für ein Aufzeichnungs_Datum nur einmal gerechnet werden. Das Ergebnis muss 5 sein.

D. h. ich muss DISTINCT beim Aufzeichnungs_Datum verwenden.
Hier bin ich mit meinem Latein am Ende und hoffe von einem SQL-Kenner die Lösung zu bekommen.
 

Attachments

  • Test.zip
    527 bytes · Views: 245

JOTHA

Well-Known Member
Licensed User
Longtime User
Hallo strupp01 ...
Test = sql_SchlafGut.ExecQuerySingleResult("SELECT sum(Druck) FROM Allgemein where Datum_Aufzeichnung <= 170403 and Datum_Aufzeichnung >= 170402 order by Datum_Aufzeichnung ASC")

Wenn du in einem 2. Durchgang statt "ORDER BY" --> "GROUP BY" verwendest, kannst Du mit Cursor.RowCount die Anzahl der Zeilen ermitteln.
Das entspricht dann auch gleichzeitig der Anzahl vom jeweiligen Aufzeichnungs_Datum.
 

JOTHA

Well-Known Member
Licensed User
Longtime User
Im ersten Durchgang holst Du Dir dein gewünschtes Ergebnis (was immer auch das sein mag), oder möchtest Du eigentlich nur wissen, wieviel ...
Es darf die Anzahl bei Druck für ein Aufzeichnungs_Datum nur einmal gerechnet werden. Das Ergebnis muss 5 sein.
... das im Ergebnis ausmacht?

Mit GROUP BY wird in der Tabelle der Datumswert (welcher bei Dir hundertfach vorkommt) nur einmal gelistet, dann der nächste ... und so weiter.
Mit Cursor.RowCount werden dann nur die Zeilen gezählt. Das wäre ja dann auch "5", oder?

Mit ORDER BY sortierst du die Tabelle.
Mit GROUP BY gruppierst du die Tabelle.

In deinem Fall:

B4X:
Test = sql_SchlafGut.ExecQuerySingleResult("SELECT sum(Druck) FROM Allgemein where Datum_Aufzeichnung <= 170403 and Datum_Aufzeichnung >= 170402 GROUP BY Datum_Aufzeichnung ASC")
... da müsste dann als Ergebnis "5" rauskommen ...
 

JOTHA

Well-Known Member
Licensed User
Longtime User
Also mit deiner beigefügten Tabelle kann ich nichts anfangen, sie enthält 6 Datensätze (siehe Bild), mehr ist nicht zu sehen ...

Habe ich deine Frage verstanden?
Du willst wissen: "Es darf die Anzahl bei Druck für ein Aufzeichnungs_Datum nur einmal gerechnet werden. Das Ergebnis muss 5 sein."

Wenn Du meinen Code verwendest, zählt er für ein Datum (z.B. für heute) nur "1", auch wenn 500 mal gedruckt worden wäre.
Oder meinst Du etwas anderes? ... dann formuliere es anders ...
 

Attachments

  • Druck.png
    Druck.png
    4.5 KB · Views: 282

strupp01

Active Member
Licensed User
Longtime User
wenn in meiner beigefügten Tabelle bei Datum Aufzeichnung am 170403 bei allen 3 Uhrzeiten in der Spalte Druck 500 stehen würde, so müßte als Ergebnis aus meiner DB 501 herauskommen.
 

Attachments

  • Test.zip
    541 bytes · Views: 247
Top