SQL Abfrage nach Zeit gesteuert

querytail

Erfahrenes Mitglied
Hallo zusammen,

ich habe 2 Tabellen (tab_order: id, orderdate, email & tab_config name, delay) und muss diese Verknüpfen.

In der tab_config stehen der name und delay (Verzögerung-Tage) 5, 7, 10. Nun soll bei abruf der tab_order die spalte tab_order.orderdate mit dem aktuellen Datum und tab_config.delay in Beziehung gebracht werden.

Ist die Order mehr als 5-7 Tage her, wähle name aus der Zeile delay 5, bei 7-10 wähle name aus der Zeile delay 7 usw.

Wie macht man sowas?

Danke

querytail
 
Als erstes sollten wir mal definieren mit was für einer Datenbank du arbeiten willst. MySQL, Oracle, MS SQL?

Zudem versteh ich deine Beschreibung nicht wirklich

Mach mir bitte ein Datenbeispiel mit Tabellen. So in der Art:
Das hab ich:
Code:
Tabelle mitarbeiter
id | firma_id | name
--------------------
1  | 1        | MA1
2  | 1        | MA2
3  | 2        | MA3

Tabelle Firma
id | name
---------------------
1  | firma1
2  | firma2

Nun will ich wissen, welche Firma wieviele Mitarbeiter hat. Das soll dann so aussehen
Code:
firma_id | firma_name | anzahl_mitarbeiter
------------------------------------------
1        | firma1     | 2
2        | firma3     | 1
 
Hach schade, hätte ich gewußt, dass Du so spät noch antwortest. :) Klasse.

Es soll zuerst abgefragt werden, wie lange eine Bestellung her ist und ob check leer ist.
Liegt das orderdate soweit zurück, dass die delay-Zeit tab_config id 1 erreicht wird, soll der entsprechende Name der Tabelle tab_config von id 1 ausgegeben werden und in check das aktuelle Datum eingetragen werden. Ist in check ein Datum und wird die delay-Zeit von Tabelle tab_config id 2 erreicht, wird name 2 ausgegeben usw.

tab_order: id, orderdate, email, check
Code:
Tabelle: tab_order
id |      orderdate      | email         | check
-----------------------------------------------------------
1  | 20.09.2011        | xx@xx.de   |  25.09.2011
2  | 21.09.2011        | xy@xx.de   |  26.09.2011
3  | 24.09.2011        | xz@xx.de   |
 
Tabelle: tab_config id, name, delay
------------------------------------------
id |      name             | delay
----------------------------------------
1  |         abc            | 5
2  |         bcd            | 7
3  |         cde            | 10

Danke im voraus

Grüße

Michael Meyer
 
Zuletzt bearbeitet von einem Moderator:
Ah so. Alles klar.

Du kannst bei chekc auf NULL prüfen.
Mit DATEDIFF kannst du die Differenz in Tagen von heute zum orderdate ermitteln.
Damit kannst du im SELECT-Teil eun Subquery absetzen um den Namen aus der Config auszulesen. Einfach alle Datensätze umgekehrt sortiert nehmen, deren delay kleiner oder Gleich der Datumsdifferenz ist. Und davon mit LIMIT den ersten auswählen

SQL:
SELECT
	o.*,
	(
		SELECT 
			c.`name` 
		FROM 
			tab_config AS c 
		WHERE 
			c.delay <= DATEDIFF(NOW(), o.orderdate) 
		ORDER BY
			delay DESC 
		LIMIT 1
	) AS delay_text
FROM
	tab_order AS o
WHERE
	o.`check` IS NULL
 
Zuletzt bearbeitet von einem Moderator:
Wow, danke, das funktioniert schonmal und das auf "kleinstem Raum" :). Nur müsste die Prüfung von check ergeben, dass nur bei ungleich NULL der Name der nächsten Zeile (also ID 2 aus tab_config bzw. 3 usw.) genommen wird, wenn die delay-Zeit erreicht wird.

Dann habe ich noch eine Frage, wie ich das Sternchen durch gezieltes Abfragen der einzelnen Spalten ersetzen kann. Es scheint nämlich so zu sein, dass in der Schleife die Werte nur ausgegeben werden, wenn ich beispielsweise die id explizit eingebe.

Code:
select o.id, o* ( ...

Großes DANKESCHÖN schonmal ******
 
Zuletzt bearbeitet:
Guten Morgen ******

So, das Sternchen konnte ich entfernen. Mit der Staffelung der Abfrage tue ich mich etwas schwer.

Im Moment sieht es so aus, dass keine Ausgabe mehr kommt, wenn in CHECK ein Datum steht. Die endgültige Prüfung von CHECK müsste so aussehen, dass ID1 nur ausgegeben wird, wenn NULL und ID2, ID3 usw. aus tab_config nur dann ausgegeben werden, wenn CHECK ungleich NULL bzw. 0 und delay von ID2, ID3 usw. erreicht.

Kann ich das mit IF oder CASE machen?
 
Ich versteh Bahnhof.

Mach mir bitte ein Datenbeispiel mit Tabellen. So in der Art:
Das hab ich:
Code:
Tabelle mitarbeiter
id | firma_id | name
--------------------
1  | 1        | MA1
2  | 1        | MA2
3  | 2        | MA3

Tabelle Firma
id | name
---------------------
1  | firma1
2  | firma2

Nun will ich wissen, welche Firma wieviele Mitarbeiter hat. Das soll dann so aussehen
Code:
firma_id | firma_name | anzahl_mitarbeiter
------------------------------------------
1        | firma1     | 2
2        | firma3     | 1
 
Hallo, Beim Schreiben ist mir aufgefallen, dass ich eine weitere Spalte zur Prüfung benötige. Ich habe die Spalte active in tab_order eingesetzt.

Ein Beispiel:

In der Tabelle tab_order unter id 3 ist in check keine Eintragung, weshalb nach erreichen des delays tab_config der name aus id 1 (abc) ausgegeben wird. Gleichzeitig wird in Check ein Datum eingetragen. Das ist korrekt und soll so bleiben.

Nun soll aber auch geprüft werden, ob in check ungleich NULL und active NULL ist. Dann würde bei erreichen der delay-Zeit bei id 2 der name ausgegeben werden. Bei 1 passiert nichts mehr.


Code:
Tabelle: tab_order
id |      orderdate      | email         | check            | active
--------------------------------------------------------------------- | --------
1  | 20.09.2011        | xx@xx.de   |  25.09.2011  | 1
2  | 21.09.2011        | xy@xx.de   |  26.09.2011  |  
3  | 24.09.2011        | xz@xx.de   |                    | 
 
Tabelle: tab_config id, name, delay
------------------------------------------
id |      name             | delay
----------------------------------------
1  |         abc            | 5
2  |         bcd            | 7
3  |         cde            | 10
 
Kommt auf den Datentype von active an. Wenn es ein Int ist und er NULL oder 1 ist, dann kannst ud es so lösen
SQL:
...
WHERE
    o.`check` IS NULL
    OR o.active IS NULL
 
Zuletzt bearbeitet von einem Moderator:
Das Problem ist, dass so bei active = 1 und check = NULL auch der Name ausgegeben wird. Diesen Fall muss ich irgendwie unterbinden.
 

Neue Beiträge

Zurück