AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQl Abfrage sehr langsam
Thema durchsuchen
Ansicht
Themen-Optionen

SQl Abfrage sehr langsam

Ein Thema von tkhandel · begonnen am 21. Jun 2024 · letzter Beitrag vom 27. Jun 2024
Antwort Antwort
tkhandel

Registriert seit: 2. Jan 2022
Ort: Arnsberg im Sauerland
106 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: SQl Abfrage sehr langsam

  Alt 26. Jun 2024, 12:17
Versuch 1 klappt, bei Versuch 2 kennt er Zahlart nicht auch wenn ich tu. davor setze nicht
Jürgen
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#2

AW: SQl Abfrage sehr langsam

  Alt 26. Jun 2024, 12:45
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;

Geändert von Delphi.Narium (26. Jun 2024 um 23:25 Uhr) Grund: Schreibfehler, Syntaxfehler im dritten SQL behoben
  Mit Zitat antworten Zitat
tkhandel

Registriert seit: 2. Jan 2022
Ort: Arnsberg im Sauerland
106 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: SQl Abfrage sehr langsam

  Alt 26. Jun 2024, 21:56
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);
Jürgen

Geändert von mkinzler (27. Jun 2024 um 06:34 Uhr) Grund: SQL-Tags ergänzt
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#4

AW: SQl Abfrage sehr langsam

  Alt 26. Jun 2024, 23:26
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.662 Beiträge
 
Delphi 12 Athens
 
#5

AW: SQl Abfrage sehr langsam

  Alt 26. Jun 2024, 23:39
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
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
695 Beiträge
 
FreePascal / Lazarus
 
#6

AW: SQl Abfrage sehr langsam

  Alt 27. Jun 2024, 05:43
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.
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
Firebird 5 Update und Know-how Workshop – 28.8.-29.08.2025 64546 Mörfelden - Walldorf
  Mit Zitat antworten Zitat
tkhandel

Registriert seit: 2. Jan 2022
Ort: Arnsberg im Sauerland
106 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: SQl Abfrage sehr langsam

  Alt 27. Jun 2024, 16:10
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]
Jürgen
  Mit Zitat antworten Zitat
tkhandel

Registriert seit: 2. Jan 2022
Ort: Arnsberg im Sauerland
106 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: SQl Abfrage sehr langsam

  Alt 27. Jun 2024, 16:18
Hallo in die Runde,

das Beispiel von Uwe Raabe läuft durch, birngt aber ein leeres Dataset.
Jürgen
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.662 Beiträge
 
Delphi 12 Athens
 
#9

AW: SQl Abfrage sehr langsam

  Alt 27. Jun 2024, 16:27
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
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 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