Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQl Abfrage sehr langsam (https://www.delphipraxis.net/215368-sql-abfrage-sehr-langsam.html)

tkhandel 21. Jun 2024 09:23

Datenbank: Interbase • Version: 2020 • Zugriff über: FD

SQl Abfrage sehr langsam
 
Hallo
ich habe eine SQL-Abfrage die im Client ausgeführt wird, und sehr langsam ist.
Wahrscheinlich wäre ja eine Storedprocedure viel schneller ich kriege es aber
einfach nicht hin.

Hat jemand einen TIP wie ich diese Abfrage, die mehrere Summen verschiedener Spalten
aus einer Tabelle abfragen soll, verbessern könnte:

Select
FahrerNr, b.Name,

(Select Sum(VKBG)
from Tagesumsatz x
where x.FahrerNr = TU.FahrerNr
and cast(Datum as Date) = :EingabeDatum) as Umsatz,

(Select Sum(VKBG)
from Tagesumsatz x
where x.FahrerNr = TU.FahrerNr
and cast(Datum as Date) = :EingabeDatum and Zahlart = 1) as Bar,

(Select Sum(VKBG)
from Tagesumsatz x
where x.FahrerNr = TU.FahrerNr
and cast(Datum as Date) = :EingabeDatum and Zahlart = 3) as Karte,

(Select Sum(VKBG)
from Tagesumsatz x
where x.FahrerNr = TU.FahrerNr
and cast(Datum as Date) = :EingabeDatum and Zahlart = 2) as LS

from Tagesumsatz TU left join Fahrer b on b.Nr = tu.FahrerNr

Group by FahrerNr, Name

gubbe 21. Jun 2024 09:41

AW: SQl Abfrage sehr langsam
 
Als erstes würde ich mir anschauen, ob auf die relevanten Spalten aus dem Join und den Where-Bedingungen ein index gesetzt ist. Ist das der Fall oder hast Du darauf einen Einfluß?

Delphi.Narium 21. Jun 2024 10:14

AW: SQl Abfrage sehr langsam
 
Meinst Du sinngemäß sowas?
SQL-Code:
select -- Zuletzt die Summen je FahrerNr bilden
  FahrerNr,
  b.Name,
  Sum(Umsatz) as Umsatz,
  Sum(Bar) as Bar,
  Sum(Karte) as Karte,
  Sum(LS) as LS
from (
  select -- FahrerNr, Name und Umsatz nach Zahlart separieren
    FahrerNr,
    b.Name,
    VKBG as Umsatz,
    case when Zahlart = 1 then VKBG else 0 end as Bar,
    case when Zahlart = 3 then VKBG else 0 end as Karte,
    case when Zahlart = 2 then VKBG else 0 end as LS
  from (
    select -- uns interessieren nur die Daten zum EingabeDatum
      FahrerNr,
      VKBG
    from Tagesumsatz
    where cast(Datum as Date) = :EingabeDatum
  ) TU
  -- nur die Fahrerdaten zum EingabeDatum dazu holen,
  -- anstatt zuerst alle Fahrerdaten zu beliebigem Datum zusammensuchen
  -- und dann erst die zum EingabeDatum zu separieren.
  left join Fahrer b on b.Nr = tu.FahrerNr
) a
Group by
  FahrerNr,
  Name;
(nur hingedaddelt, deshalb kann ich den einen oder anderen Schreib- bzw. Syntaxfehler nicht ausschließen)

Papaschlumpf73 21. Jun 2024 11:35

AW: SQl Abfrage sehr langsam
 
Und die folgende Zeile würde ich genau andersrum machen:

where cast(Datum as Date) = :EingabeDatum

Also nicht (für Mio. Datensätze) das Feld "Datum" in einen anderen Datentyp casten, sondern den Parameter :EingabeDatum einmal in den Datentyp vom Feld "Datum" casten.

Jasocul 21. Jun 2024 13:42

AW: SQl Abfrage sehr langsam
 
Zitat:

Zitat von Papaschlumpf73 (Beitrag 1538083)
Und die folgende Zeile würde ich genau andersrum machen:

where cast(Datum as Date) = :EingabeDatum

Also nicht (für Mio. Datensätze) das Feld "Datum" in einen anderen Datentyp casten, sondern den Parameter :EingabeDatum einmal in den Datentyp vom Feld "Datum" casten.

Vor allem wenn auf dem Datumsfeld ein Index ist, wird dieser durch das Cast sehr wahrscheinlich ingoriert. Kein Index = langsam

Uwe Raabe 21. Jun 2024 13:59

AW: SQl Abfrage sehr langsam
 
Zitat:

Zitat von Papaschlumpf73 (Beitrag 1538083)
Und die folgende Zeile würde ich genau andersrum machen:

where cast(Datum as Date) = :EingabeDatum

Also nicht (für Mio. Datensätze) das Feld "Datum" in einen anderen Datentyp casten, sondern den Parameter :EingabeDatum einmal in den Datentyp vom Feld "Datum" casten.

Das muss nicht unbedingt funktionieren, z.B. wenn das Feld einen Time-Anteil hat, der beim CAST(Datum as DATE) auf 0 gesetzt wird.

Delphi.Narium 21. Jun 2024 14:22

AW: SQl Abfrage sehr langsam
 
Und wenn man's so macht? Hat man 'nen Cast des Datum auf den DATE-Typen, mit ggfls. abgeschnittenem Zeitanteil und darauf auch 'nen Index.

SQL-Code:
create index IX_Cast_DATUM on Tagesumsatz computed by (cast(DATUM as DATE))


Vielleicht immer noch nicht optimal, aber schonmal nicht indexlos.

oder
SQL-Code:
where datum >= Cast(:Eingabedatum as Date) and datum < Cast(:Eingabedatum + 1 as Date)


Naja, solange wir nicht wissen, welchen Datentyp die Spalte DATUM in der Tabelle Tagesumsatz hat, ist das halt alles Spekulation. Und wenn wir dann noch wüssten um welche Datenmengen es sich handelt, könnten die Vorschläge deutlich zielgerichteter erfolgen.

Jumpy 24. Jun 2024 07:04

AW: SQl Abfrage sehr langsam
 
Keine Ahnung, ob es das besser macht, aber man kann Delphi.Nariums abfrage noch einkürzen:

SQL-Code:
select
    t.FahrerNr,
    b.Name,
    Sum(VKBG) as Umsatz,
    Sum(case when Zahlart = 1 then VKBG else 0 end) as Bar,
    Sum(case when Zahlart = 3 then VKBG else 0 end) as Karte,
    Sum(case when Zahlart = 2 then VKBG else 0 end) as LS
From Tagesumsatz t
Left join Fahrer b on b.Nr = tu.FahrerNr
Where cast(Datum as Date) = :EingabeDatum
Group by
  FahrerNr, Name;

tkhandel 24. Jun 2024 13:33

AW: SQl Abfrage sehr langsam
 
Danke für die vielen Antworten,
werde es heute Abend mal probieren.
die Spalte Datum ist tatsächlich DateTime Feld.

joachimd 25. Jun 2024 09:28

AW: SQl Abfrage sehr langsam
 
wenn DateTime, dann wird über cast(datum as date) die Optimierung umgangen.

Delphi.Narium 25. Jun 2024 10:03

AW: SQl Abfrage sehr langsam
 
Wenn DateTime, aber (beide Seiten) ohne Zeitanteil, kann man sich Cast as Date sparen.

Wenn mit Zeitanteil und :EingabeDatum ohne Zeitanteil dann eher sowas:
SQL-Code:
where Datum between :von and :bis

:von wird im Programm mit sowas wie Trunc(Now) und :bis mit Trunc(Now + 1) - 1 / 86400000 (= eine Millisekunde) gefüllt, das ergibt dann sinngemäß sowas wie
SQL-Code:
where Datum between 25.06.2024 00:00:00.000 and 25.06.2024 23:59:59.999

Dann dürfte der Index auch genutzt werden können.

Geht es nur um das Datum ohne Zeitanteil sollte
SQL-Code:
where datum >= Cast(:Eingabedatum as Date) and datum < Cast(:Eingabedatum + 1 as Date)
funktionieren. Wenn :Eingabedatum ohne Zeitanteil geliefert wird, verkürzt sich das dann auf
SQL-Code:
where datum >= :Eingabedatum and datum < :Eingabedatum + 1


Der Flaschenhals im Ausgangs-SQL dürfte aber die spaltenweisen Summierungen per Sub-Select sein. Hier muss die Datenbank eine sehr große Menge von Abfragen starten, je Ergebniszeile vier Stück und die jeweils ohne 'nen Index verwenden zu können.

tkhandel 25. Jun 2024 17:27

AW: SQl Abfrage sehr langsam
 
Ich habe mal alles probiert aber es kommt immer der gleiche Fehler
den ich nicht lokalisieren kann

select
FahrerNr,
b.Name,
Sum(VKBG) as Umsatz,
Sum(case when Zahlart = 1 then VKBG else 0 end) as Bar,
Sum(case when Zahlart = 3 then VKBG else 0 end) as Karte,
Sum(case when Zahlart = 2 then VKBG else 0 end) as LS
From Tagesumsatz t Left join Fahrer b on b.Nr = t.FahrerNr
where datum >= :Eingabedatum and datum < :Eingabedatum + 1
Group by FahrerNr, Name;


Unsuccessful execution caused by a system error that precludes
successful execution of subsequent statements.
Dynamic SQL Error.
expression evaluation not supported.
--------------------------------------------------------------
SQLCODE: -902
GDSCODE: 335544569

mkinzler 25. Jun 2024 17:35

AW: SQl Abfrage sehr langsam
 
Ich vermute mal der Error kommt vom Versuch den Parameter zu inkrementieren:

SQL-Code:
where datum >= :Eingabedatum and datum < :Eingabedatum + 1
Versuch mal
SQL-Code:
where datum >= :Eingabedatum and datum < DateAdd( day, 1, :Eingabedatum)
Btw. Ich würde die (Tabellen-)Aliase konsequent verwenden.

tkhandel 25. Jun 2024 22:43

AW: SQl Abfrage sehr langsam
 
Hallo, ich glaube ehr es liegt irgendwie an

Sum(case when Zahlart = 1 then VKBG else 0 end) as Bar

auch kennt er dateadd nicht das scheint ja eine udf zu sein die ich nicht habe.
kann es sein das es bei der IBToGo bzw. IBLite Einschränkungen im Fuktionsumfang gibt?

IBExpert 26. Jun 2024 05:29

AW: SQl Abfrage sehr langsam
 
mach das mal mit 2 parametern statt mit einem und den dann mit +1 zu verändern.
das scheint interbase nicht brauchbar umzusetzen.

außerdem sollte eigentlich auch interbase between können

where datum between :Eingabedatum_von and :Eingabedatum_bis


Zitat:

Zitat von tkhandel (Beitrag 1538216)
Ich habe mal alles probiert aber es kommt immer der gleiche Fehler
den ich nicht lokalisieren kann

select
FahrerNr,
b.Name,
Sum(VKBG) as Umsatz,
Sum(case when Zahlart = 1 then VKBG else 0 end) as Bar,
Sum(case when Zahlart = 3 then VKBG else 0 end) as Karte,
Sum(case when Zahlart = 2 then VKBG else 0 end) as LS
From Tagesumsatz t Left join Fahrer b on b.Nr = t.FahrerNr
where datum >= :Eingabedatum and datum < :Eingabedatum + 1
Group by FahrerNr, Name;


Unsuccessful execution caused by a system error that precludes
successful execution of subsequent statements.
Dynamic SQL Error.
expression evaluation not supported.
--------------------------------------------------------------
SQLCODE: -902
GDSCODE: 335544569


Delphi.Narium 26. Jun 2024 11:44

AW: SQl Abfrage sehr langsam
 
Oder zerpflück mal das SQL aus Antwort #3:

Zuerst
SQL-Code:
    select -- uns interessieren nur die Daten zum EingabeDatum
      FahrerNr,
      VKBG
    from Tagesumsatz
    where Datum between :EingabeDatumVon and :EingabeDatumBis
Übergib zwei Parameter, denn mit Delphi kann man problemlos die Datumswerte für den zu verwendenden Zeitraum berechnen. Außerdem hat es den Charme, dass Du zu einem späteren Zeitpunkt, wenn sich z. B. die Anforderungen ändern, das SQL für jeden beliebigen Zeitraum nutzen kannst. Damit kann man dann unverändert auch mal für 'ne Woche oder 'nen Monat oder auch nur 'ne Stunde, die Werte ermitteln (sofern im Datum auch der Zeitanteil enthalten ist).

Erst wenn dieses kurze SQL Ergebnisse zu Deiner Zufriedenheit liefert, kümmerst Du dich bitte um den "Rest".

Der zweite Versuch geht dann mit:
SQL-Code:
  select -- FahrerNr, Name und Umsatz nach Zahlart separieren
    FahrerNr,
    b.Name,
    VKBG as Umsatz,
    case when Zahlart = 1 then VKBG else 0 end as Bar,
    case when Zahlart = 3 then VKBG else 0 end as Karte,
    case when Zahlart = 2 then VKBG else 0 end as LS
  from (
    select -- uns interessieren nur die Daten zum EingabeDatum
      FahrerNr,
      VKBG
    from Tagesumsatz
    where where Datum between :EingabeDatumVon and :EingabeDatumBis
  ) TU
  -- nur die Fahrerdaten zum EingabeDatum dazu holen,
  -- anstatt zuerst alle Fahrerdaten zu beliebigem Datum zusammensuchen
  -- und dann erst die zum EingabeDatum zu separieren.
  left join Fahrer b on b.Nr = tu.FahrerNr
Erst wenn hier die Ergebnisse stimmen, wird die Summierung darum gebaut:
SQL-Code:
select -- Zuletzt die Summen je FahrerNr bilden
  FahrerNr,
  Name,
  Sum(Umsatz) as Umsatz,
  Sum(Bar) as Bar,
  Sum(Karte) as Karte,
  Sum(LS) as LS
from (
  select -- FahrerNr, Name und Umsatz nach Zahlart separieren
    FahrerNr,
    b.Name,
    VKBG as Umsatz,
    case when Zahlart = 1 then VKBG else 0 end as Bar,
    case when Zahlart = 3 then VKBG else 0 end as Karte,
    case when Zahlart = 2 then VKBG else 0 end as LS
  from (
    select -- uns interessieren nur die Daten zum EingabeDatum
      FahrerNr,
      VKBG
    from Tagesumsatz
    where Datum between :EingabeDatumVon and :EingabeDatumBis
  ) TU
  -- nur die Fahrerdaten zum EingabeDatum dazu holen,
  -- anstatt zuerst alle Fahrerdaten zu beliebigem Datum zusammensuchen
  -- und dann erst die zum EingabeDatum zu separieren.
  left join Fahrer b on b.Nr = tu.FahrerNr
) a
Group by
  FahrerNr,
  Name;
Solltest Du bis hierher kommen und die Laufzeit immer noch nicht passen, dann kümmern wir uns auch noch um die Laufzeit. Dazu brauchen wir dann aber ein paar Infos mehr, z. B.: Datenmengen in den beiden Tabellen, wenn irgend möglich vollständige Tabellendefinitionen, Indexdefinitionen, ungefähre Infos zu den Mengenverhältnissen zwischen Fahrer und Tagesumsatz. Könntest Du uns ggfls. auch Testdaten zur Verfügung stellen ...?

PS.:

Meine SQLs sind oft von innen nach außen in diverse Unterabfragen aufgeteilt, weil meine Erfahrung zeigt, dass so die auftretenden Fehler oder Dateninkonsitenzen einfacher zu lokalisieren sind. Kurze SQLs, auf ein Minimum an Schreibarbeit reduziert, bedeuten nicht zwingend, dass dann auch die Laufzeit auf ein Minimum reduziert wird. Frei nach dem Motto: Möglichst früh die zu verarbeitende Datenmenge reduzieren, dann die benötigten Zusatzdaten aus anderen Tabellen dazuholen und auf der "Restmenge" dann die Rechenarbeit, wie Summierungen, Zählen, Gruppierungen und Sortierung durchführen (ungefähr so, als müsste ich mir die Infos aus einem Wust von Karteikarten in unterschiedlichen Karteikästen von Hand raussuchen. Wie komme ich da mit dem wenigsten Aufwand ans erwünschte Ergebnis? Verblüffenderweise klappt das bei der Nutzung von Datenbanken dann auch oft erstaunlich gut ;-).

tkhandel 26. Jun 2024 12:17

AW: SQl Abfrage sehr langsam
 
Versuch 1 klappt, bei Versuch 2 kennt er Zahlart nicht auch wenn ich tu. davor setze nicht

Delphi.Narium 26. Jun 2024 12:45

AW: SQl Abfrage sehr langsam
 
Da in dem Select, das den Namen TU erhält, keine Zahlart enthalten ist, kann es auch keine tu.Zahlart geben.

In welcher Tabelle steht denn die Zahlart? Könntest Du uns bitte die Tabellendefinitionen zur Verfügung stellen. Ohne die ist es eine furchtbare Sucherei mit recht geringen Erfolgschancen.

Wenn Zahlart in der Tabelle Tagesumsatz steht, muss das innere SQL so aussehen:
SQL-Code:
    select -- Bitte hier alle Spalten aufführen, die aus der Tabelle Tagesumsatz benötigt werden
      FahrerNr,
      VKBG,
      Zahlart
    from Tagesumsatz
    where Datum between :EingabeDatumVon and :EingabeDatumBis
Vermutlich muss es dann mit demhier weitergehen:
SQL-Code:
 select -- FahrerNr, Name und Umsatz nach Zahlart separieren
    tu.FahrerNr,
    b.Name,
    tu.VKBG as Umsatz,
    case when tu.Zahlart = 1 then tu.VKBG else 0 end as Bar,
    case when tu.Zahlart = 3 then tu.VKBG else 0 end as Karte,
    case when tu.Zahlart = 2 then tu.VKBG else 0 end as LS
  from (
    select -- uns interessieren nur die Daten zum EingabeDatum
      FahrerNr,
      VKBG,
      Zahlart
    from Tagesumsatz
    where Datum between :EingabeDatumVon and :EingabeDatumBis
  ) TU
  -- nur die Fahrerdaten zum EingabeDatum dazu holen,
  -- anstatt zuerst alle Fahrerdaten zu beliebigem Datum zusammensuchen
  -- und dann erst die zum EingabeDatum zu separieren.
  left join Fahrer b on b.Nr = tu.FahrerNr
Die dritte Variante könnte dann dashier werden:
SQL-Code:
select -- Zuletzt die Summen je FahrerNr bilden
  FahrerNr,
  Name,
  Sum(Umsatz) as Umsatz,
  Sum(Bar) as Bar,
  Sum(Karte) as Karte,
  Sum(LS) as LS
from (
 select -- FahrerNr, Name und Umsatz nach Zahlart separieren
    tu.FahrerNr,
    b.Name,
    tu.VKBG as Umsatz,
    case when tu.Zahlart = 1 then tu.VKBG else 0 end as Bar,
    case when tu.Zahlart = 3 then tu.VKBG else 0 end as Karte,
    case when tu.Zahlart = 2 then tu.VKBG else 0 end as LS
  from (
    select -- uns interessieren nur die Daten zum EingabeDatum
      FahrerNr,
      VKBG,
      Zahlart
    from Tagesumsatz
    where Datum between :EingabeDatumVon and :EingabeDatumBis
  ) TU
  -- nur die Fahrerdaten zum EingabeDatum dazu holen,
  -- anstatt zuerst alle Fahrerdaten zu beliebigem Datum zusammensuchen
  -- und dann erst die zum EingabeDatum zu separieren.
  left join Fahrer b on b.Nr = tu.FahrerNr
) a
Group by
  FahrerNr,
  Name;

tkhandel 26. Jun 2024 21:56

AW: SQl Abfrage sehr langsam
 
Hallo nee geht auch nicht hier mal die Tabellenstruktur:

1. Tabelle Fahrer (enthält die Liste der Verkaufsfahrer (derzeit 10 maximal 100 Datensätze)
SQL-Code:
 Create TABLE FAHRER (
    ID        VARCHAR(60) NOT NULL,
    NR        INTEGER,
    ANREDE    VARCHAR(10),
    VORNAME   VARCHAR(60),
    NAME      VARCHAR(60),
    STRASSE   VARCHAR(60),
    PLZ       VARCHAR(5),
    ORT       VARCHAR(60),
    TELEFON_1  VARCHAR(20),
    TELEFON_2  VARCHAR(20),
    MAIL      VARCHAR(120)
)  ALTER TABLE FAHRER ADD PRIMARY KEY (ID);
2. Tabelle Tagesumsatz (enthält eine Liste der Verkäufe aller Fahrer kommt aus den Kassen)
(30-50 Datensätze je Fahrer je Verkaufstag)

SQL-Code:
CREATE TABLE TAGESUMSATZ (
    ID        VARCHAR(60) NOT NULL,
    TOURID    VARCHAR(60),
    KUNDEID   VARCHAR(60),
    FAHRERID  VARCHAR(1),
    FAHRERNR  INTEGER,
    BELEGNR   VARCHAR(20),
    DATUM     TIMESTAMP,
    ZAHLART   INTEGER,
    VKNG      DOUBLE PRECISION,
    VKBG      DOUBLE PRECISION,
    MWST1      DOUBLE PRECISION,
    MWST2      DOUBLE PRECISION,
    ABGEBUCHT BOOLEAN,
    MARGE     DOUBLE PRECISION
); ALTER TABLE Tagesumsatz ADD PRIMARY KEY (ID);

Delphi.Narium 26. Jun 2024 23:26

AW: SQl Abfrage sehr langsam
 
Was genau geht nicht? Das erste SQL? Das zweite SQL? Das dritte SQL?

Ergeben alle einfach nur kein Ergebnis oder gibt es eine (oder mehrere) Fehlermeldung(en)?

Wenn es Fehlermeldungen gibt, wie lauten sie?

Im dritten SQL muss es am Anfang Name und nicht b.Name heißen.

Dann läuft das SQL bei mir unter FireBird 3.

Habe den Fehler oben behoben.

Uwe Raabe 26. Jun 2024 23:39

AW: SQl Abfrage sehr langsam
 
Wenn das SUM(CASE..) nicht geht, werfe ich dann mal einen anderen Ansatz in den Ring:
SQL-Code:
select
  tu.FahrerNr,
  b.Name,
  SUM(tu.VKBG) as Umsatz,
  SUM(tu1.VKBG) as Bar,
  SUM(tu2.VKBG) as Karte,
  SUM(tu3.VKBG) as LS
from Tagesumsatz tu
left join Fahrer b on b.Nr = tu.FahrerNr
left join Tagesumsatz tu1 on tu.Zahlart = 1 and tu1.ID = tu.ID
left join Tagesumsatz tu2 on tu.Zahlart = 2 and tu2.ID = tu.ID
left join Tagesumsatz tu3 on tu.Zahlart = 3 and tu3.ID = tu.ID
where tu.Datum between :EingabeDatumVon and :EingabeDatumBis
group by tu.FahrerNr, b.Name

IBExpert 27. Jun 2024 05:43

AW: SQl Abfrage sehr langsam
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1538282)
Dann läuft das SQL bei mir unter FireBird 3.

Scheint aber vom Threadersteller mit Interbase gebraucht zu werden und das ist einiges weniger lauffähig.
Muss aber jeder selber wissen, warum man an Interbase festhält.

tkhandel 27. Jun 2024 16:10

AW: SQl Abfrage sehr langsam
 
Was genau geht nicht? Das erste SQL? Das zweite SQL? Das dritte SQL?

1. Beispiel geht, 2 und d3 nicht

Ergeben alle einfach nur kein Ergebnis oder gibt es eine (oder mehrere) Fehlermeldung(en)?

2 und 3 Fehlermeldung:

Unsuccessful execution caused by a system error that precludes
successful execution of subsequent statements.
Dynamic SQL Error.
expression evaluation not supported.
--------------------------------------------------------------
SQLCODE: -902
GDSCODE: 335544569


Wenn es Fehlermeldungen gibt, wie lauten sie?

Im dritten SQL muss es am Anfang Name und nicht b.Name heißen.

Dann läuft das SQL bei mir unter FireBird 3.

Habe den Fehler oben behoben.[/QUOTE]

tkhandel 27. Jun 2024 16:18

AW: SQl Abfrage sehr langsam
 
Hallo in die Runde,

das Beispiel von Uwe Raabe läuft durch, birngt aber ein leeres Dataset.

Uwe Raabe 27. Jun 2024 16:27

AW: SQl Abfrage sehr langsam
 
Bringt dies denn zumindest die erwarteten Daten?
SQL-Code:
select
  tu.FahrerNr,
  b.Name,
  SUM(tu.VKBG) as Umsatz
from Tagesumsatz tu
left join Fahrer b on b.Nr = tu.FahrerNr
where tu.Datum between :EingabeDatumVon and :EingabeDatumBis
group by tu.FahrerNr, b.Name

Delphi.Narium 27. Jun 2024 17:31

AW: SQl Abfrage sehr langsam
 
Wenn Uwes SQL funktioniert wäre mein nächster Versuch:
SQL-Code:
select
  tu.FahrerNr,
  b.Name,
  tu.Zahlart,
  SUM(tu.VKBG) as Umsatz
from Tagesumsatz tu
left join Fahrer b on b.Nr = tu.FahrerNr
where tu.Datum between :EingabeDatumVon and :EingabeDatumBis
group by tu.FahrerNr, b.Name, tu.Zahlart
order by tu.FahrerNr, b.Name, tu.Zahlart
Wenn das beides weiterhin eine leere Ergebnismenge abliefern sollte, würd' ich's mal so probieren:
SQL-Code:
select
  tu.FahrerNr,
  b.Name,
  tu.Zahlart,
  SUM(tu.VKBG) as Umsatz
from Tagesumsatz tu
left join Fahrer b on b.Nr = tu.FahrerNr
where tu.FahrerNr = 12345 -- hier eine existierende Fahrernummer einfügen.
group by tu.FahrerNr, b.Name, tu.Zahlart
order by tu.FahrerNr, b.Name, tu.Zahlart
Wenn es dann funktioniert haben wir bei der Übergabe der Datumswerte ein Problem, dem wir dann auf den Grund gehen müssen.

tkhandel 27. Jun 2024 18:28

AW: SQl Abfrage sehr langsam
 
Ergebnis Code Uwe Raabe:

12010 Hoffmann 132,40
12011 Wittberg 635,55
12012 Schmitt 536,15

usw.

halt nur der gesamt Umsatz ohne unterteilung nach Zahlungsart.

tkhandel 27. Jun 2024 18:36

AW: SQl Abfrage sehr langsam
 
Ergebnisse von dir...

12010 Hoffmann 1 132,400
12011 Wittberg 1 259,750
12011 Wittberg 3 375,800
12012 Schmitt 1 155,650
12012 Schmitt 3 380,500

Delphi.Narium 27. Jun 2024 18:45

AW: SQl Abfrage sehr langsam
 
Funkitioniert das?
SQL-Code:
select
  tu.FahrerNr,
  b.Name,
  tu.VKBG as Umsatz,
  case when tu.Zahlart = 1 then tu.VKBG else 0 end as Bar,
  case when tu.Zahlart = 3 then tu.VKBG else 0 end as Karte,
  case when tu.Zahlart = 2 then tu.VKBG else 0 end as LS
from Tagesumsatz tu
left join Fahrer b on b.Nr = tu.FahrerNr
where tu.Datum between :EingabeDatumVon and :EingabeDatumBis
order by tu.FahrerNr, b.Name, tu.VKBG
Wenn ja, dann bitte das probieren:
SQL-Code:
select
  tu.FahrerNr,
  b.Name,
  Sum(tu.VKBG) as Umsatz,
  Sum(case when tu.Zahlart = 1 then tu.VKBG else 0 end) as Bar,
  Sum(case when tu.Zahlart = 3 then tu.VKBG else 0 end) as Karte,
  Sum(case when tu.Zahlart = 2 then tu.VKBG else 0 end) as LS
from Tagesumsatz tu
left join Fahrer b on b.Nr = tu.FahrerNr
where tu.Datum between :EingabeDatumVon and :EingabeDatumBis
group by tu.FahrerNr, b.Name
order by tu.FahrerNr, b.Name
Wenn etwas nicht funktioniert bitte die Fehlermeldung posten.

Wie war die Laufzeit der letzten beiden Versuche?
Besser als beim ursprünglichen SQL oder eher ähnlich "langatmig"?

Uwe Raabe 27. Jun 2024 19:17

AW: SQl Abfrage sehr langsam
 
Ich habe an meinem ursprünglichen Vorschlag eine kleine Änderung gemacht. Statt überall tu.Zahlart heißt es nun jeweils tu1.Zahlart usw.
SQL-Code:
select
  tu.FahrerNr,
  b.Name,
  SUM(tu.VKBG) as Umsatz,
  SUM(tu1.VKBG) as Bar,
  SUM(tu2.VKBG) as Karte,
  SUM(tu3.VKBG) as LS
from Tagesumsatz tu
left join Fahrer b on b.Nr = tu.FahrerNr
left join Tagesumsatz tu1 on tu1.Zahlart = 1 and tu1.ID = tu.ID
left join Tagesumsatz tu2 on tu2.Zahlart = 2 and tu2.ID = tu.ID
left join Tagesumsatz tu3 on tu3.Zahlart = 3 and tu3.ID = tu.ID
where tu.Datum between :EingabeDatumVon and :EingabeDatumBis
group by tu.FahrerNr, b.Name

tkhandel 27. Jun 2024 20:07

AW: SQl Abfrage sehr langsam
 
DANKE!!!!

Die Codeanpassung von Uwe Raabe hat funktioniert. Bei allen anderen Codes bleibt die Fehlermeldung
bestehnen. Ich glaube mitlerweile es liegt am IB der einfach nix mit "case when .." (zumindest
in diesem Fall) nix anfangen kann.

Hat mich echt weitergebracht also vielen Dank nochmal an alle Helfer!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:40 Uhr.

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