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.