Delphi-PRAXiS
Seite 6 von 7   « Erste     456 7      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Datum aus voriger Zeile zum berechnen (https://www.delphipraxis.net/201703-datum-aus-voriger-zeile-zum-berechnen.html)

HolgerX 25. Aug 2019 19:08

AW: Datum aus voriger Zeile zum berechnen
 
Zitat:

Zitat von concept2015 (Beitrag 1443162)
Die Abfrage mit coalesce:
Code:
SELECT Qechtdat,wer,nummer,
JulianDay(Qechtdat) - 
coalesce((SELECT JulianDay(Qechtdat) as Tage ,0)
FROM Zwischen t2
WHERE t2.nummer = t1.nummer AND
JulianDay (t2.Qechtdat) < JulianDay(t1.Qechtdat)
ORDER BY
JulianDay(t2.Qechtdat)
DESC LIMIT 1) AS Tage FROM Zwischen t1
where Jahr = "2019"
and nummer = "139"
Es kommt - der beschriebene Fehler

coalesce((SELECT JulianDay(Qechtdat) as Tage ,0)

Wie p80286 schon schrieb : Zähl die Klammern!
-> 3x Öffnen und nur 2x Schließen....

coalesce((SELECT JulianDay(Qechtdat) as Tage) ,0)

So müsste diese Zeile lauten.... ;)

concept2015 26. Aug 2019 06:04

AW: Datum aus voriger Zeile zum berechnen
 
In dem kleinen Ausschnitt betrachtet:

coalesce((SELECT JulianDay(Qechtdat) as Tage ,0)

stimmt es, was ihr sagt - aber der Blick auf die Ganze Abfrage zeigt, das die Klammern richtig sind.

Wenn ich coalesce( und ,0) entferne, läuft die
Abfrage, bis auf den Fehler in Zeile 1 der Ausgabe.

Schokohase 26. Aug 2019 06:38

AW: Datum aus voriger Zeile zum berechnen
 
Dann schauen wir uns die Abfrage in der Gänze an und arbeiten uns mal zum Kern weiter vor:
SQL-Code:
SELECT Qechtdat,wer,nummer,
JulianDay(Qechtdat) - 
coalesce((SELECT JulianDay(Qechtdat) as Tage ,0)
FROM Zwischen t2
WHERE t2.nummer = t1.nummer AND
JulianDay (t2.Qechtdat) < JulianDay(t1.Qechtdat)
ORDER BY
JulianDay(t2.Qechtdat)
DESC LIMIT 1) AS Tage FROM Zwischen t1
where Jahr = "2019"
and nummer = "139"
Jetzt nehmen wir (ausgehend von den Klammern) alles das, was zum
SQL-Code:
coalesce(...)
gehört:
SQL-Code:
coalesce((SELECT JulianDay(Qechtdat) as Tage ,0)
FROM Zwischen t2
WHERE t2.nummer = t1.nummer AND
JulianDay (t2.Qechtdat) < JulianDay(t1.Qechtdat)
ORDER BY
JulianDay(t2.Qechtdat)
DESC LIMIT 1)
und nun betrachten wir mal das Innere von
SQL-Code:
coalesce(...)
SQL-Code:
(SELECT JulianDay(Qechtdat) as Tage ,0)
FROM Zwischen t2
WHERE t2.nummer = t1.nummer AND
JulianDay (t2.Qechtdat) < JulianDay(t1.Qechtdat)
ORDER BY
JulianDay(t2.Qechtdat)
DESC LIMIT 1
Dieses ergibt einfach keinen Sinn und wird darum auch zurecht als fehlerhaft zurückgewiesen.

Ein einfaches Klammern zählen hilft hier nicht.

Billa 26. Aug 2019 06:39

AW: Datum aus voriger Zeile zum berechnen
 
Hallo,

ich bin hier gerade reingestolpert habe mir das SELECT-Statement nur sehr oberflächlich angeschaut. Könnte etwas mehr Klarheit erreicht werden, wenn allen selektierten Feldern der Qualifier der jeweiligen Abfrage vorangestellt würde? Ich sehe z.B. nicht auf einen Blick, welches "QechtDat" in Zeile 4 gewünscht ist: das aus T1 oder das aus T2? Also "T1.QechtDat" oder "T2.QechtDat"...

In solchen Fällen hilft es mir, wenn ich "von aussen nach innen" arbeite. In diesem Fall also statt der inneren Abfrage mit coalesce erstmal eine Konstante eintragen und schauen, ob die Ergebnisse den Voraussetzungen entsprechen. Erst wenn das ok ist, erweitere ich die Abfrage.

ähhh.... Schokohase war schneller.

Schokohase 26. Aug 2019 06:55

AW: Datum aus voriger Zeile zum berechnen
 
So und zur Auflösung gibt es jetzt auch ein wirklich funktionierendes Statement, was tatsächlich auch die Werte liefert, die gewünscht sind:
SQL-Code:
SELECT
  Qechtdat,
  wer,
  nummer,
  JulianDay(Qechtdat) - COALESCE(
    ( 
      SELECT
        JulianDay(Qechtdat) As Tage
      FROM
        Zwischen t2
      WHERE
        t2.nummer = t1.nummer
      AND
        JulianDay (t2.Qechtdat) < JulianDay(t1.Qechtdat)
      ORDER BY
        JulianDay(t2.Qechtdat) DESC
      LIMIT
        1
    ),
    JulianDay(Qechtdat)
  ) AS Tage
FROM
  Zwischen t1
WHERE
  Jahr = "2019"
AND
  nummer = "139";
und hier auch noch der Beweis

concept2015 26. Aug 2019 07:09

AW: Datum aus voriger Zeile zum berechnen
 
Danke für die Mühe - aber der Fehler im Ergebnis (Zeile 1) ist
noch da !
In der ersten Zeile kann kein Datum vorher stehen - muss also null
sein -

Die Grunddaten sind:
QEchtDat WER Nummer
2019-01-10 Demag 139
2019-01-19 Demag 139
2019-01-25 Demag 139
2019-02-01 Demag 139
2019-02-08 Demag 139
2019-02-13 Demag 139

Es handelt sich hier um Kundenbesuche mit der Frage, wieviele Tage zwischen den Besuchen liegen.
Logischerweise kann in Zeile 1 keine Berechnung erfolgen, da es sich um den ersten Besuch handelt.

Das gesuchte Ergebnis müsste so aossehen:
QEchtDat WER Nummer Tage
2019-01-10 Demag 139 0
2019-01-19 Demag 139 9
2019-01-25 Demag 139 6
....

Schokohase 26. Aug 2019 07:12

AW: Datum aus voriger Zeile zum berechnen
 
Klickst du auf der Beweis

Ich sehe da als Ergebnis
Code:
QEchtDat       WER     Nummer Tage
2019-01-10      Demag   139     0
2019-01-19      Demag   139     9
2019-01-25      Demag   139     6
2019-02-01      Demag   139     7
2019-02-08      Demag   139     7

concept2015 26. Aug 2019 07:28

AW: Datum aus voriger Zeile zum berechnen
 
:-D:-D:-D

Bei mir in SqLiteexpert:

QEchtDat WER Nummer Tage
2019-01-10 Demag 139 20
2019-01-19 Demag 139 9
2019-01-25 Demag 139 6
2019-02-01 Demag 139 7
2019-02-08 Demag 139 7
2019-02-13 Demag 139 5

:oops:

So weit waren wir doch schon ohne COALESCE(

Und auf DER BEWEIS kommt kein Ergebnis ?
You need to build the schema before you can run a query.

Schokohase 26. Aug 2019 07:40

AW: Datum aus voriger Zeile zum berechnen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Screenshot sqlfiddle
Anhang 51583
Screenshot SQliteExpert
Anhang 51584
Ich kann dir anscheinend nicht helfen (ich frage mich allerdings auch wer es könnte)

jobo 26. Aug 2019 08:09

AW: Datum aus voriger Zeile zum berechnen
 
Zitat:

Zitat von concept2015 (Beitrag 1443244)
Und auf DER BEWEIS kommt kein Ergebnis ?
You need to build the schema before you can run a query.

sqlfiddle hinkt manchmal oder will einen anderen Browser..
einfach später noch mal probieren

"Build Your Schema" möchte nur, dass Du den Knopf drückst, um Tabellen anzulegen und Daten einzuspielen, also das Script auf der linken Seite (manuell) starten.
Auf der rechten kannst Du die Abfrage formulieren, ändern, starten.

Ist aber alles auch Wurscht, wenn es nicht klappt. Das ist ja nur ein Hilfsmittel, um online 100% das Gleiche zu machen und über das Gleiche zu reden.
Script kopieren und lokal ausführen muss zum gleichen Ergebnis führen, das ist der Punkt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:48 Uhr.
Seite 6 von 7   « Erste     456 7      

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