ottscho
Goto Top

SQL Query - Borland Interbase DB

Morgen,

ich versuche mich an einer SQL Query und bekomme es nicht hin.
Folgendes Statement funktionert soweit:

select min(AFADAT) AS MINDAT, AFNAME,  from WDAUFTRAG
group by AFNAME
order by 1 desc

Jetzt werde mir alle Datensätze von allen Jahren angezeigt, ich will aber nur die von 2011.

Wie kann ich nun eine WHERE Afrage auf die erste Spalte einbinden?
WHERE 1 <= ...
WHERE min(AFADAT) <= ...
WHERE MINDAT <= ..

Leider alles ohne Erfolg.

Jmd eine Idee?

Danke

Content-ID: 173974

Url: https://administrator.de/contentid/173974

Ausgedruckt am: 22.11.2024 um 10:11 Uhr

Logan000
Logan000 30.09.2011 um 09:41:50 Uhr
Goto Top
Moin Moin


Du willst mir nicht ernsthaft erzählen, das wenn du ein (möglicherweise) Fehlerhaftes SQL Statement absetzt du die Rückmeldung:
Leider alles ohne Erfolg.
bekommst?
face-wink

So auf die schnelle (ohne Tabellen, Datentypen und Interbase genauer zu kennen) würde ich sagen...
so solte es eigendlich funktionieren:
select min(AFADAT) AS MINDAT, AFNAME  from WDAUFTRAG
WHERE MINDAT <= 2011
group by AFNAME
order by 1 desc
ottscho
ottscho 30.09.2011 um 10:00:43 Uhr
Goto Top
ähmm, WHERE MINDAT geht nicht hatte ich ja obene im Posting geschrieben.
Das ansprechen der ersten Spalte funtkioniert eben nicht! Das schaffe ich nicht.

Unter MSSQL würde es mit dem Alias MINDAT gehen. Ich hasse Borland Interbase face-sad
Logan000
Logan000 30.09.2011 um 10:10:16 Uhr
Goto Top
Moin moin

Zitat von @ottscho:
ähmm, WHERE MINDAT geht nicht hatte ich ja obene im Posting geschrieben.
Stimmt. Und ich hatte durchblicken lassen das ich eine fehlermeldung (z.B. syntaxfehler .. oder ähnliches) erwarten würde.
Nicht nur auf deinem Bildschim sondern auch in deinen Posts.

Das ansprechen der ersten Spalte funtkioniert eben nicht!
Warum muss es denn unbedingt die erste spate sein?
Probiers mal so:
select min(AFADAT) AS MINDAT, AFNAME  from WDAUFTRAG
WHERE AFADAT <= 2011
order by 1 desc
erstmal ohne group.

Gruß L.
ottscho
ottscho 30.09.2011 um 10:38:51 Uhr
Goto Top
Wenn ich das GROUP weglasse, geht die min() funktion nicht mehr ;)

select min(AFADAT) AS MINDAT, AFNAME from WDAUFTRAG
WHERE MINDAT <= '01.01.2011'  
group by AFNAME
order by 1 desc

Fehler: Column unknown MINDAT

select min(AFADAT) AS MINDAT, AFNAME from WDAUFTRAG
WHERE AFADAT <= '01.01.2011'  

invalid column reference

Warum muss es denn unbedingt die erste spate sein?
DA ja in der ersten Spalte das MIN(Datum) steht und ich das auf 2011 begrenzen möchte.
Logan000
Logan000 30.09.2011 um 11:54:52 Uhr
Goto Top
Moin

Zitat von @ottscho:
Wenn ich das GROUP weglasse, geht die min() funktion nicht mehr ;)
Die würde ich auch erstmal links liegen lassen.

>Warum muss es denn unbedingt die erste spate sein?
DA ja in der ersten Spalte das MIN(Datum) steht und ich das auf 2011 begrenzen möchte.
Und wenn du AFADAT auf 2011 begrenzt?

select AFADAT, AFNAME from WDAUFTRAG
WHERE WDAUFTRAG.AFADAT <= '01.01.2011'  
bzw. mit min und Group:
select min(AFADAT), AFNAME from WDAUFTRAG
WHERE WDAUFTRAG.AFADAT <= '01.01.2011'  
group by AFNAME 

Wie siehts damit aus?

Gruß L.
ottscho
ottscho 30.09.2011 um 12:12:03 Uhr
Goto Top
Das passt das Ergebis nicht mehr:

select min(AFADAT), AFNAME from WDAUFTRAG
WHERE WDAUFTRAG.AFADAT <= '01.01.2011'  
group by AFNAME
order by 1 asc



Screenshot:
http://www.myimg.de/?img=screen9d917.jpg
Logan000
Logan000 30.09.2011 um 12:49:58 Uhr
Goto Top
Moin
Zitat von @ottscho:
Das passt das Ergebis nicht mehr:
Wiso? Das Ergebnis spiegelt doch exackt das SQL Statement wieder?
Oder ist ein Datum > 1.1.2011 enthalten?

Zur Erinnerung:
Wie kann ich nun eine WHERE Afrage auf die erste Spalte einbinden?
WHERE 1 <= ...
WHERE min(AFADAT) <= ...
WHERE MINDAT <= ..

Und immerhin kein
Column unknown
oder
invalid column reference

Ich habe leider keine Ahnung ob Interbase Funktionen wie YEAR() oder BETWEEN() kennt.
Daher versuchs einfach mal so:
select min(AFADAT), AFNAME from WDAUFTRAG
WHERE WDAUFTRAG.AFADAT >= '01.01.2011' AND WDAUFTRAG.AFADAT <= '31.12.2011'  
group by AFNAME
order by 1 asc

Gruß L.
ottscho
ottscho 30.09.2011 um 12:52:33 Uhr
Goto Top
Ja, hast recht. Sorry mein Fehler face-smile
Hatte das Größerzeichen verwechselt.
Danke dir.
ottscho
ottscho 04.10.2011 um 12:56:42 Uhr
Goto Top
So, leider klappt es nicht wie gewünscht.
Führe ich folgendes Script aus:
select min(AFADAT), AFNAME from WDAUFTRAG
WHERE WDAUFTRAG.AFADAT>= '01.01.2011'  
group by AFNAME
order by 1 asc
Erhalte ich knapp 600 Datensätze. Das sind viel zu viele.

Führe ich dies aus:
select min(AFADAT) AS MINDAT, AFNAME,  from WDAUFTRAG
group by AFNAME
order by 1 desc

Erhalte ich natürlich noch viel mehr. Schaue ich mir dann aber die Datensätze an, welche als Datum im Jahr 2011 liegen, so sind es nur noch 47 Stück.
Aber keine 600!
Logan000
Logan000 04.10.2011 um 13:26:13 Uhr
Goto Top
Moin Moin

1. Es ist nicht klug Fragen in gelösten Beiträgen zu formulieren.
2. Was dein 1. SQL Statement angeht (sehe keinen Sinn darin über das 2. zu reden)
rate ich mal, das hängt mit dem Datentyp WDAUFTRAG.AFADAT zusammen (den ich nicht kenne).
Wenn die Spalte WDAUFTRAG.AFADAT als String (varchar, char, oder was immer Interbase da noch so kennt) definiert ist, wird der Vergleich wohl Einträge wie '02.01.2000' zulassen.

Du köntest versuchen Text '01.01.2011' via Cast als Date zu konvertieren.
Etwa so:
select min(AFADAT), AFNAME from WDAUFTRAG
WHERE WDAUFTRAG.AFADAT>= Cast( '01.01.2011' as date)  
group by AFNAME
order by 1 asc

Falls die Spalte WDAUFTRAG.AFADAT ebenfall kein Date ist kannst du es auch mal so versuchen:
select min(AFADAT), AFNAME from WDAUFTRAG
WHERE WDAUFTRAG.AFADAT>= Cast( '01.01.2011' as date)  
group by AFNAME
order by 1 asc

Nebenbei: Du soltest dir dringend eine SQL Referenz von interbase besorgen.

Gruß L.
ottscho
ottscho 04.10.2011 um 13:58:50 Uhr
Goto Top
1. Hätte ich ein neues Thema mit dem gleichen Problem aufgemacht, hättest bestimmt das gleiche gesagt ;)
2. ok

Der Datentyp von AFADAT ist TIMESTAMP.
Das Statement mit CAST erbringt das gleiche Ergebnis.

Ich glaube über die WHERE Klausel im Bezug auf AFADAT und nicht auf MIN(AFADAT) wird das Ergebnis verfläscht.
Aber eine WHERE Klausel auf MIN(AFADAT) oder auf die Alias von MIN(AFADAT) gibt Interbase einfach nicht her.
Daher kommen wir hier so nicht weiter.

Ich danke dir für deine Hilfe.
Logan000
Logan000 04.10.2011 um 14:24:40 Uhr
Goto Top
Moin

1. Hätte ich ein neues Thema mit dem gleichen Problem aufgemacht, hättest bestimmt das gleiche gesagt ;)
Ja vielleicht.


Der Datentyp von AFADAT ist TIMESTAMP.
Das Statement mit CAST erbringt das gleiche Ergebnis.
Du hast das Statement dann auch auf Cast as timestamp umgeschrieben?

Ich glaube über die WHERE Klausel im Bezug auf AFADAT und nicht auf MIN(AFADAT) wird das Ergebnis verfläscht.
Das würde allen SQL Dialekten die ich kenne (auch wenn IInterbase nicht dazugehört sind es dennoch einige) wiedersprechen.
Das min() greift doch nur das kleinere bei den Datensätzen heraus wo mehere Einträge AFADAT mit identischem AFNAME existieren.
Nach dem Where wohlgemerkt.

Wenn Du recht hättest müste
select AFADAT, AFNAME from WDAUFTRAG
WHERE WDAUFTRAG.AFADAT>= Cast( '01.01.2011' as timestamp)  
order by 1 asc
zwar immer das ein AFADAT im richtigen Jahr anzeigen, wärend
select min(AFADAT), AFNAME from WDAUFTRAG
WHERE WDAUFTRAG.AFADAT>= Cast( '01.01.2011' as timestamp)  
group by AFNAME
order by 1 asc
auch ältere Einträge enthält.

Gruß L.
ottscho
ottscho 04.10.2011 um 15:17:02 Uhr
Goto Top
Beide Statements zeigen nur Einträge von diesem Jahr.

Meine Theorie:

Mit der Klausel
WHERE WDAUFTRAG.AFADAT>= Cast( '01.01.2011' as timestamp)
werden alle Datensätze von diesem Jahr angezeigt und dann über min(AFADAT) und group nur noch die Datensätze mit den jeweils kleinstem Datum.
Die Groupierung kann aber auch Datensätze in den vorherigen Jahren beinhalten.

Ohne die Klausel
WHERE WDAUFTRAG.AFADAT>= Cast( '01.01.2011' as timestamp)
werden alle Datensätze mit dem Mindestdatum angezeigt.

Mh, für mich so unlösbar.