1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

SQL-Abfrage Kunden ohne geplantes Ereignis

Dieses Thema im Forum "PostgreSQL" wurde erstellt von eversmann1986, 28 August 2019.

  1. eversmann1986

    eversmann1986 Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    was steht denn dann drin in dem Feld 'Beginnzeit'? Vermutlich NULL, oder? Dann einfach im WHERE das abfragen:

    Code:
    WHERE beginnzeit IS NULL
    
     
  3. eversmann1986

    eversmann1986 Benutzer

    Nein es steht das Datum drin für den geplanten Call.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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?
     
  5. eversmann1986

    eversmann1986 Benutzer

    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:

  6. castorp

    castorp Datenbank-Guru

    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);
     
  7. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  8. akretschmer

    akretschmer Datenbank-Guru

    oder halt wie @castorp es gezeigt hat ;-)
     
  9. eversmann1986

    eversmann1986 Benutzer

    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.
     
  10. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  11. eversmann1986

    eversmann1986 Benutzer

    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"
     
  12. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  13. eversmann1986

    eversmann1986 Benutzer

    Sorry aber ich verstehe nur Bahnhof. Wie gesagt ich bin Anfänger in SQL. Was genau muss ich denn jetzt mit dem Query machen, dass eure Lösung rauskommt?
     
  14. akretschmer

    akretschmer Datenbank-Guru

    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;
    
     
  15. eversmann1986

    eversmann1986 Benutzer

    Ich bekomme leider vom Programm eine Fehlermeldung.

    Es sind nur SELECT Abfrageanweisungen (SQL) zugelassen. :(
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden