Thema: Delphi Hilfe bei SQL Abfrage

Einzelnen Beitrag anzeigen

Rülps

Registriert seit: 26. Sep 2008
38 Beiträge
 
#1

Hilfe bei SQL Abfrage

  Alt 15. Mär 2017, 09:29
Datenbank: SQLite • Version: 3 • Zugriff über: SQLite3.pas
Hallo zusammen,

ich habe eine Tabelle mit vielen Events
Code:
Year  | Month | Day | Event  | Duration
2016  | 04    | 01  | blabla | 20
2016  | 04    | 01  | blabla | 3
2016  | 04    | 01  | blabla | 12
2016  | 04    | 03  | blabla | 8
Mit dem SQL Wrapper für SQLite kann ich Abfragen folgendermaßen durchführen:
Delphi-Quellcode:
var
  slDBPath: string;
  sldb: TSQLiteDatabase;
  sltb: TSQLIteTable;
begin
  slDBPath := ExtractFilepath(Application.ExeName) + 'MeineSQLiteDatenbank.db';
  sldb := TSQLiteDatabase.Create(slDBPath);
  sltb := slDb.GetTable('SELECT * FROM events WHERE Year = "2016"');
Die Ergebnisse der Abfrage stehen in sltb, die ähnlich wie eine StringList behandelt werden kann:
Delphi-Quellcode:
var
  iTotalDuration: integer;
  iEventDuration: integer;
begin
  iTotalDuration := 0;
  for i := 0 to sltb.Count - 1 do
  begin
    if TryStrToInt(sltb.FieldAsString(sltb.FieldIndex['Duration']), iEventDuration) then
    begin
      iTotalDuration := iTotalDuration + iEventDuration;
    end;
  end;
Ich will die Duration monatsweise aufsummieren und überlege mir gerade wie ich die vorkommenden Monate am besten ermitteln kann. Meine SQL Kenntnisse sind relativ simpel und meine einzige Idee bisher ist:
(1) durch eine SQL Abfrage alle Jahre ausgeben lassen
(2) doppelte Jahreseinträge entfernen
(3) für jedes Jahr Monatsabfragen zu erstellen
Delphi-Quellcode:
  for i := iYearStart to iYearEnd do
  begin
    // Januar
    sltb := slDb.GetTable('SELECT * FROM events WHERE Month = "1"');
      if sltb.count > 0 then
      begin
        // aufsummieren
      end;
    // Februar
    sltb := slDb.GetTable('SELECT * FROM events WHERE Month = "2"');
      if sltb.count > 0 then
      begin
        // aufsummieren
      end;
    // März
    sltb := slDb.GetTable('SELECT * FROM events WHERE Month = "3"');
      if sltb.count > 0 then
      begin
        // aufsummieren
      end;
    // April
    sltb := slDb.GetTable('SELECT * FROM events WHERE Month = "4"');
      if sltb.count > 0 then
      begin
        // aufsummieren
      end;
    // usw.
  end;
Mir kommt das zu kompliziert vor. Gibt es eine SQL Abfrage, die ihr kennt, die mir das Leben leichter macht? z.B. eine die mir gleich nur alle vorkommenden Jahre zurückgibt.
*Doppel-Rülps*
  Mit Zitat antworten Zitat