![]() |
AW: Datum aus voriger Zeile zum berechnen
(langfristig hilft das ungemein!)
Da ich nicht weiß, bzw. nachvollziehen kann ob der Subselect funktioniert, solltest Du sicherstellen daß
SQL-Code:
solche mißverständlichen Formulierungen nicht auftauchen.
...
JulianDay(Qechtdat) - (SELECT JulianDay(Qechtdat) As Integer ... Und dann
SQL-Code:
und dann schauen wir mal weiter.
...
JulianDay(Qechtdat) -coalesce( (SELECT JulianDay(Qechtdat) As PrevDate ... ,0) From ...... Gruß K-H |
AW: Datum aus voriger Zeile zum berechnen
Die ganze Abfrage mit Subselect und Ergebnis steht in #38
Subselect klappt. Nur die erste Zeile ist logischerweise falsch, da kein Datum davor existiert. In meinem Beipiel steht in der ersten Zeile eine 20 ??? wo nimmt er die her ? Die erste Zeile muss zwingend eine 0 sein Die Abfrage:
bringt die Rohdaten:
2019-01-10 //erster Besuch (keine vergangenen Tage) //Tage = 0 //weil nicht mit Datum vorher berechenbar. 2019-01-19 //zweiter Besuch wieviel Tage sind vergangen // seit erstem Besuch = 9 2019-01-25 //dritter Besuch wieviel Tage sind vergangen // seit zweitem Besuch = 6 ... Ich muss praktisch den ersten Durchlauf ohne Berechnung machen - alle weiteren mit Berechnung. -coalesce((SELECT JulianDay(Qechtdat) As PrevDate ... ,0) bringt einen Syntax-Fehler bei as Wenn ich z.B. eine Zählvariable einbauen könnte, würde ich Sql erst ab dem zweiten Satz berechnen lassen. |
AW: Datum aus voriger Zeile zum berechnen
Oh entschuldige,da hab ich mich vertan
SQL-Code:
Gruß
-coalesce(SELECT JulianDay(Qechtdat)...
,0) As PrevDate K-H P.S. Wenn der Subselect funktioniert sollte er null für den ersten Datensatz liefern das wird dann durch coalesce(subselect,0) zu 0, und das war doch was du wolltest? |
AW: Datum aus voriger Zeile zum berechnen
Hallo :-D,
egal, wie ich den Befehl coalesce einbaue, Syntax Fehler. Hier nochmal der Code, der bis auf die erste Zeile klappt
Code:
Ich hab noch keine verständliche deutsche Erklärung für den Befehl "coalesce" gefunden, darum fische ich mit Deinem Tip im trüben.
SELECT Qechtdat,wer,nummer,
JulianDay(Qechtdat) - (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) AS Tage FROM Zwischen t1 where Jahr = "2019" and nummer = "139" Aber trotzdem vielen Dank für Deine Geduld. |
AW: Datum aus voriger Zeile zum berechnen
Hmm..
Zitat:
![]() Die Beschreibung ist gleich mit der von MySQL (2. Link in EN), Oracle und SQLite: ![]() ![]() ![]() Somit sollte diese Funktion in allen DB-Systemen vorhanden sein... und somit sollte -coalesce((SELECT JulianDay(Qechtdat) As PrevDate , 0) entweder das letzte Datum, wenn vorhanden und somit nicht NULL, zurück liefern, ansonsten, wenn kein Datum vom SubSelect kommt (somit NULL) die '0'. |
AW: Datum aus voriger Zeile zum berechnen
Der Code:
Code:
Liefert im SQLiteExpertPro64 und in Delphi den Fehler:
JulianDay(Qechtdat) -
coalesce((SELECT JulianDay(Qechtdat) PrevDate , 0) FROM Zwischen t2 near "Form":syntax error Auch in einer Zeile geschrieben :( |
AW: Datum aus voriger Zeile zum berechnen
Zähl mal die Klammern!
Gruß K-H |
AW: Datum aus voriger Zeile zum berechnen
Die Abfrage mit coalesce:
Code:
Es kommt - der beschriebene Fehler
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" Die gleiche Abfrage ohne coalesce
Code:
Bis auf Zeile 1 läuft es.
SELECT Qechtdat,wer,nummer,
JulianDay(Qechtdat) - (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) AS Tage FROM Zwischen t1 where Jahr = "2019" and nummer = "139" Wo habe ich den Fehler ? |
AW: Datum aus voriger Zeile zum berechnen
SQL-Code:
Gruß
SELECT Qechtdat,wer,nummer,
JulianDay(Qechtdat) - coalesce(SELECT JulianDay(Qechtdat) FROM Zwischen t2 WHERE t2.nummer = t1.nummer AND JulianDay (t2.Qechtdat) < JulianDay(t1.Qechtdat) ORDER BY JulianDay(t2.Qechtdat) DESC LIMIT 1),0) AS Tage FROM Zwischen t1 where Jahr = "2019" and nummer = "139" K-H |
AW: Datum aus voriger Zeile zum berechnen
1 zu 1 kopiert
:( near "Select": syntax error :pale: |
AW: Datum aus voriger Zeile zum berechnen
Zitat:
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.... ;) |
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. |
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:
Jetzt nehmen wir (ausgehend von den Klammern) alles das, was zum
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"
SQL-Code:
gehört:
coalesce(...)
SQL-Code:
und nun betrachten wir mal das Innere von
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)
SQL-Code:
coalesce(...)
SQL-Code:
Dieses ergibt einfach keinen Sinn und wird darum auch zurecht als fehlerhaft zurückgewiesen.
(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 Ein einfaches Klammern zählen hilft hier nicht. |
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. |
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:
und hier auch noch
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"; ![]() |
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 .... |
AW: Datum aus voriger Zeile zum berechnen
Klickst du auf
![]() 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 |
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. |
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) |
AW: Datum aus voriger Zeile zum berechnen
Zitat:
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. |
AW: Datum aus voriger Zeile zum berechnen
Idee: In den Subselect muss auch die Einschränkung auf Jahr und Monat rein!
Die 20 in der ersten Zeile sind somit die Tage seit dem letzten Besuch im Vormonat und da z.B. Schokohase vermutlich in seinen Testdaten keinen Vormonat hat, kommt er da auf 0? Evtl. liefert der Subselect nach der Einschränkung Null statt 0, dann muss da ggf. noch sowas wie ein "Wenn Null dann 0" drum, in Oracle wäre das NVL, keine Ahnung wie bei FB der Befehl heißt. |
AW: Datum aus voriger Zeile zum berechnen
Also klar, andere Daten ergeben natürlich andere Ergebnisse. Dafür ist ja ein Testfall da, wie Schokohase ihn gemacht hat.
|
AW: Datum aus voriger Zeile zum berechnen
Der Tip von Ralph war goldrichtig.
Idee: In den Subselect muss auch die Einschränkung auf Jahr und Monat rein!
Code:
bringt:
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) AND t2.Jahr = "2019" -- <---- ! AND nummer = "139" -- <---- ! ORDER BY JulianDay(t2.Qechtdat) DESC LIMIT 1),JulianDay(Qechtdat)) AS Tage FROM Zwischen t1 WHERE Jahr = "2019" AND nummer = "139" 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 2019-02-13 Demag 139 5 2019-02-27 Demag 139 14 Mit COALESCE( .... ohne ,0) DANKE Ralph :-D:-D:-D Und auch DANKE an alle anderen, die sich über mein Problem den Kopf zerbrochen haben.8-) |
AW: Datum aus voriger Zeile zum berechnen
Zitat:
oder ![]() Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:08 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