SQL Abfrage

B

Baalbock

Hallo zusammen,

ich habe ein kleines Problem und komme nicht weiter.
Ich habe ein Tabelle Kunde und eine Tabelle Activität.
Nun soll ich zu jedem Kunden bei dem die letzte Aktivität vor 12 Monaten war herausfinden.
Ich kann zwar die Kunden ermitteln für die keine Aktivität vor 12 Monaten erstellt wurde, aber wenn eine aktuelle Aktivität vorhanden
ist, wird der Kunde auch angegeben.

Könnt Ihr mir bitte weiterhelfen.

Danke und Gruß
Baalbock
 
Mit einem Subquery

Subquery: Tabelle activitaet gruppieren auf kunden_id. Die Gruppierung mit HAVING filtern auf alle bei denen der MAX(datumsfeld) älter als 12 Monate ist.
-> HAVING filtert auf das Resultat des GROUPS BY, während WHERE auf die Quelle des GROUP BY filtert.

Haubtquery: Tabelle kunden deren ID im Subquery vorhanden ist


SQL:
SELECT
	k.*
FROM 
	kunde AS k
WHERE
	k.id IN (	SELECT kunde_id
				FROM activitaet
				GROUP BY kunde_id
				HAVING MAX(datumsfeld) < DATE_SUB(CURRENT_DATE, INTERVAL 'MONTH' 12)
			)
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

danke für die schnelle Antwort.
Ich erhalte leider folgenden Fehler:

SQL-Fehler: ORA-30089: missing or invalid <datetime field>
30089. 00000 - "missing or invalid <datetime field>"
*Cause: A <datetime field> (YEAR, MONTH, DAY, HOUR, MINUTE, SECOND) is
expected but not found, or a <datetime field> specified the
<end field> in an <interval qualifier> is more significant
than its <start field>.
*Action:

Danke und Gruß
Baalbock
 
WIe heisst dein Datumsfeld? und welchen Typ hat es?

Mein Beispiel ist eine Trockenübung. ungetestet und dient nur als Idee. Da hats noch einige Dinge drin die du anpassen musst.
 
Ich verwende das created Feld. Es ist ein Defaultfeld in der Oracle DB und hat den Type Date
Ich habe die Werte und Felder entsprechend meiner DB angepasst, aber leider bekomme ich die Meldung das in dem SUB_DATE ein Fehler ist.
Danke.
 
Mein Beispiel ist für MySQL.
Jetzt musst du die gleiche Logik auf Oracle anpassen.

Darum sollte man immer angeben welche DB man hat

Poste doch mal deine Oracle-Version
 
oh - äh - ich meinte natürlich nicht die Version von Oracle (auch wenn ich es so geschrieben ahbe) sondern dein SQL, also die Oracle-Version des SQL-Statements mit der der Fehler auftritt.

Sorry, hatte mich unklar ausgedrückt
 
also ich nutze den SQL Developer von Oracle in der Version 1.5.5 und gebe dort die Befehle frei Hand ein.

Das wäre mein Befehl:

select row_id
from kunde
where row_id in (select target_ou_id
from activität
group by target_ou_id
Having max(created) < Date_Sub(current_date, interval 12 MONTH));
 
DATE_SUB gibts in Oracle nicht.

Wie wärs mit
SQL:
HAVING MAX(created) < ADD_MONTHS(SYSDATE, -12)
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück