Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Hilfe bei SQL Abfrage (https://www.delphipraxis.net/192033-hilfe-bei-sql-abfrage.html)

Rülps 15. Mär 2017 09:29

Datenbank: SQLite • Version: 3 • Zugriff über: SQLite3.pas

Hilfe bei SQL Abfrage
 
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.

jobo 15. Mär 2017 09:32

AW: Hilfe bei SQL Abfrage
 
Code:
select distinct year FROM events

jobo 15. Mär 2017 09:34

AW: Hilfe bei SQL Abfrage
 
oder
Code:
select year, sum(duration) as duration_sum FROM events
 group by year

nahpets 15. Mär 2017 09:45

AW: Hilfe bei SQL Abfrage
 
Auf Monatsebene:
SQL-Code:
Select Year, Month, Sum(Duration) as Duration_Sum from events
group by year, Month
Auf Tagesebene:
SQL-Code:
Select Year, Month, Day, Sum(Duration) as Duration_Sum from events
group by Year, Month, Day
Prinzipiell sind auch beliebige andere Kombinationen möglich:
SQL-Code:
Select <gewünschte Werte>, Sum(<zu summierender Wert>) as <sinnvolle Bezeichnung> from <tabellenname>
group by
<gewünschte Werte> (identisch mit der Aufzählung, der nichtsummierten Werte im Select)
So ließe sich dann auch die Summe der Laufzeit für die einzelnen Events ermitteln:
SQL-Code:
Select Event, Sum(Duration) as Duration_Sum from events
group by Event

Rülps 15. Mär 2017 12:11

AW: Hilfe bei SQL Abfrage
 
Funktioniert wunderbar :thumb: Danke an euch beide!


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz