SQL-Abfrage Kunden ohne geplantes Ereignis

eversmann1986

Benutzer
Beiträge
11
Hallo Zusammen,

ich habe folgendes Problem.

Ich möchte gerne dass mir unsere Datenbank alle Kunden anzeigt, welche kein geplantes Ereignis in der Zukunft haben. Meine wichtigen Felder sind im Prinzip nur Kundenname und Ereignis Beginnzeit.

Könnt ihr mir da weiterhelfen?

Grüße eversmann1986
 
Werbung:
was steht denn dann drin in dem Feld 'Beginnzeit'? Vermutlich NULL, oder? Dann einfach im WHERE das abfragen:

Code:
WHERE beginnzeit IS NULL
 
werd mal konkret. wenn ein Datum drin steht, wie ist das dann gleichzeitig "kein geplantes Ereignis"? Vielleicht willst Du im WHERE auf < CURRENT_DATE prüfen?
 
Unsere Datenbank ist folgendermaßen aufgebaut. Jeder Kunde hat einen Kundennamen und eine Ereignisbeginnzeit. Entweder das Ereignis ist bereits abgelaufen, also hat schon stattgefunden oder das Ereignis findet in der Zukunft statt. Um sicherzugehen dass jeder Kunde auch tatsächlich ein Ereignis in der Zukunft geplant hat, möchte ich eine SQL-Abfrage haben, die mir alle Kunden anzeigt welche kein geplantes Ereignis in der Zukunft haben.

upload_2019-8-29_8-23-46.png

Im Endeffekt möchte ich im Ergebnis sehen Kunde C und Kunde D haben keinen geplanten Termin in der Zukunft.

Ich hoffe jetzt ist es verständlicher.
 

Anhänge

  • upload_2019-8-29_8-22-47.png
    upload_2019-8-29_8-22-47.png
    8,7 KB · Aufrufe: 1
Mit NOT EXISTS sollte das gehen:

Code:
select t1.*
from the_table t1
where not exists (select *
                  from the_table t2
                  where t2.kundenname = t1.kundenname
                    and t2.ereignisbeginnzeit > current_timestamp);
 
Code:
test=*# select * from eversmann1986 ;
 kunde |    zeit   
-------+------------
 a     | 2018-12-27
 b     | 2019-08-30
 c     | 2017-04-26
 d     | 2016-05-25
 a     | 2019-02-01
 a     | 2019-10-15
 b     | 2017-06-26
(7 rows)

test=*# with alle_kunden as (select distinct kunde from eversmann1986 ), c as ( select kunde, sum(case when zeit > current_date then 1 else 0 end) as c from eversmann1986 group by kunde) select kunde from c where c=0;
 kunde
-------
 d
 c
(2 rows)

test=*#

Ich hoffe, Deine DB ist nicht wirklich so, du solltest Stammdaten (Kunde) und Bewegungsdaten (Aufträge) trennen. Ich habe daher mit alle_kunden erst einmal im Prinzip eine Kundenstammdatentabelle gebaut, die ich dann weiter verwendet habe.
 
Mit NOT EXISTS sollte das gehen:

Code:
select t1.*
from the_table t1
where not exists (select *
                  from the_table t2
                  where t2.kundenname = t1.kundenname
                    and t2.ereignisbeginnzeit > current_timestamp);

Ich komme leider nicht so ganz klar mit dem Thema Table t1 und table t2. Ich habe doch nur 1 Tabelle. Meine Tabelle lautet Kunden und ich habe einige Left Joins eingebaut um auf andere Tabellen zu verlinken. Sorry stelle mich da gerade etwas doof an, bin aber auch noch nicht allzu lange in dem Thema SQL.
 
ja, du hast nur eine Tabelle, aber sie wird mit sich selbst gejoint. Damit Du dann auf beide Seiten des Joins zugreifen kannst, werden 2 Aliase vergeben, eben t1 und t2.
 
Okay. Was muss ich denn jetzt eingeben wenn das hier mein Query ist:

Code:
SELECT 
"Verkaufschancen"."Verkaufschance-Name", 
"Verkaufschancen"."Verkaufschance: Besitzer",
"Verkaufschancen"."Stufe","Kunden"."Kundename",
GREATEST("Calls"."Anruf Beginnzeit","Events"."Bis","Tasks"."Fälligkeitsdatum") as Aktuellste_Aufgabe  FROM "Kunden"
LEFT JOIN "Verkaufschancen" ON "Kunden"."ACCOUNTID" = "Verkaufschancen"."Kunde-ID"
LEFT JOIN "Calls" ON "Calls"."ACCOUNTID"="Kunden"."ACCOUNTID"
LEFT JOIN "Tasks" ON "Tasks"."ACCOUNTID"="Kunden"."ACCOUNTID"
LEFT JOIN "Events" ON "Events"."ACCOUNTID"="Kunden"."ACCOUNTID"
 
Du könntest als sehr einfache Lösung aus dem gezeigten Select von Dir eine VIEW machen, oder es in eine WITH-Abfrage packen, und dann auf dieser Ergebnisstabelle dann weiter arbeiten wie von @castorp oder mir gezeigt.
 
da ich Deine Tabellen & Daten nicht haben, kann ich jetzt nur mal versuchen, via Copy&Paste es zu versuchen...

Code:
with temp as (
-- nun deine obige Abfrage
SELECT
"Verkaufschancen"."Verkaufschance-Name",
"Verkaufschancen"."Verkaufschance: Besitzer",
"Verkaufschancen"."Stufe","Kunden"."Kundename",
GREATEST("Calls"."Anruf Beginnzeit","Events"."Bis","Tasks"."Fälligkeitsdatum") as Aktuellste_Aufgabe  FROM "Kunden"
LEFT JOIN "Verkaufschancen" ON "Kunden"."ACCOUNTID" = "Verkaufschancen"."Kunde-ID"
LEFT JOIN "Calls" ON "Calls"."ACCOUNTID"="Kunden"."ACCOUNTID"
LEFT JOIN "Tasks" ON "Tasks"."ACCOUNTID"="Kunden"."ACCOUNTID"
LEFT JOIN "Events" ON "Events"."ACCOUNTID"="Kunden"."ACCOUNTID"
)
,
temp2 as (
select *, count(case when Aktuellste_Aufgabe > now() then 1 else 0 end))
select * from temp2 where count > 0;
 
Werbung:
Zurück
Oben