Spaltensumme ermitteln

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Spaltensumme ermitteln

Beitrag von DL3AD »

Hallo,
ich habe mir ein kleines Log - Program gebaut um die Legeleistung unserer Hühner zu erfassen.
Das Log hängt an einer MariaDB - Datenbank und der Zugriff erfolgt mit den Zeos Komponenten.
Die Tabelle tab01 hat zwei Spalten
Datum im Format Date
Eier im Format integer

In einer ZQuery greife ich mir einen Datumsbereich heraus der auch in einer Tabelle angezeigt wird.

Nun zu meiner Frage:
Wie kann ich die Spalte Eier aufsummieren um sie anzuzeigen ?

Gruß Frank

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: Spaltensumme ermitteln

Beitrag von gladio »

in etwa so

select sum(eier) as Eiersumme from Tabelle where ...

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Spaltensumme ermitteln

Beitrag von DL3AD »

Danke für die Info.
Und wie greife ich auf Eiersumme zu ?

sstvmaster
Beiträge: 576
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Spaltensumme ermitteln

Beitrag von sstvmaster »

Z.B. so:

Code: Alles auswählen

Edit1.Text:=Query1.FieldByName['Eiersumme'].asString;
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Spaltensumme ermitteln

Beitrag von charlytango »

DL3AD hat geschrieben:
Di 15. Nov 2022, 20:21
Danke für die Info.
Und wie greife ich auf Eiersumme zu ?
Moglicherweise ist etwas Hintergrundinfo hilfreich.

die SQL Anweisung

Code: Alles auswählen

SELECT SUM(eier) As Eiersumme FROM Tabelle WHERE ...
erzeugt wie jede andere fehlerfrei durchgeführte SELECT-Abfrage als Ergebnis in der TZQuery-Komponente eine Temporärtabelle die man irgendwie abfragen muss.
In diesem besonderen Fall wird eine Tabelle mit einer Zeile und einer Spalte erzeugt, wobei das Feld/Spalte Eiersumme heisst

Da funktioniert die Variante von sstvmaster natürlich klaglos und

Code: Alles auswählen

Query1.FieldByName['Eiersumme'].asString;
liefert dein Ergebnis.

Als Variante kannst du auch ein TDBText (aus dem Komponentenreiter Data Controls) benutzen, diesem über ein TDataSource an deine TZConnection binden und den Feldnamen einstellen. Dann macht Lazarus das gleich automatisch.

Haarig wird es wenn dein SQL Statement mehr als eine Zeile/Spalte liefert, dann brauchst du eine andere Strategie.

So eine Zählung oder Summenbildung sieht bei mir in etwa so aus (einfach aus Code rauskopiert und etwas angepasst);

Code: Alles auswählen

  try
    zQuery1.Close;
    zQuery1.SQL.Clear;
    zQuery1.SQL.Add('SELECT SUM(eier) As Eiersumme FROM Tabelle WHERE ...');
    zQuery1.Open;
    zQuery1.Last; //lädt ggfs ausständige Daten
    zQuery1.First;
    If ZQuery1.RecordCount > 1 then showmessage('zuviele Zeilen bei Summierung');
    result := zQuery1.fieldbyname('Eiersumme').asInteger;  //oder AsString wenns in ein Textfeld soll
    //zQuery1.Close; wenn das Feld angezeigt werden soll, dann nicht schließen
  except
    on E: Exception do
    begin
       MessageDlg('Fehler bei Summenbildung ' + LineEnding +
                   'File: ' + {$INCLUDE %FILE%} + LineEnding +
                   'Methodname: ' +  {$I %CURRENTROUTINE%} + LineEnding +
                   'Linenumber: ' + {$INCLUDE %LINE%} + LineEnding +
                   E.Message + LineEnding +
                   'Class: ' + LineEnding +
                   E.ClassName, mtError, [mbOK], 0);
          //und noch einige Logging-Aufgaben         
    end;
  end; //try 

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Spaltensumme ermitteln

Beitrag von af0815 »

charlytango hat geschrieben:
Di 15. Nov 2022, 23:49
die SQL Anweisung

Code: Alles auswählen

SELECT SUM(eier) As Eiersumme FROM Tabelle WHERE ...
erzeugt wie jede andere fehlerfrei durchgeführte SELECT-Abfrage als Ergebnis in der TZQuery-Komponente eine Temporärtabelle die man irgendwie abfragen muss.
In diesem besonderen Fall wird eine Tabelle mit einer Zeile und einer Spalte erzeugt, wobei das Feld/Spalte Eiersumme heisst
Genauer gesagt liefert das Statement ein Recordset zurück und keine temporäre Tabelle. Durch das Open erwartet die Query eben ein Ergebnis vom Typ Recordset und verarbeitet das. Aber das Recordset muss nicht komplett übertragen sein. Die Query hat die Möglichkeit das in Teilen (Chunks) anzufordern und wird es auch machen. Es macht keinen Simm 1Million Datensätze zu übertragen wenn, der Benutzer gerade mal die ersten 25 davon in der Applikation sieht.
Noch dazu muss das Recordset in der Query zwischengepuffert werden und auch Änderungen mitverfolgt. Daher kann er interne Speichplatz sich erheblich vergrößeren, wenn man die Statements nicht gut setzt. Dazu gehört auch, das man Spalten die man nicht benötigt auch nicht verwendet im Statement.

Und es macht absolut Sinn die Funktionen zu verwenden, die der SQL-Server hat zu verwenden. Der kann die Abfrage optimiert ausführen und braucht dann nur eine einzige Zeile als Recordset zurückliefern. Absolut sauber und schnell die Lösung.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Spaltensumme ermitteln

Beitrag von DL3AD »

Hallo,
vielen Dank !
Wie immer schnelle und kompetente Antworten.

Gruß Frank

Antworten