SQL Statement zur Ausgabe von Datensätzen nach mehreren Bedingungen.

nakicam

Benutzer
Beiträge
13
Hallo zusammen,

eigentlich habe ich eine Excell Tabelle jedoch konnte ich diese in eine SQL Tabelle importieren. Siehe Screenshot.



upload_2016-1-7_13-36-1.png


und hier einmal mit den gefüllten Daten:

upload_2016-1-7_13-36-44.png

Eine csv oder sql in dieses Ticket hochladen ist wohl nicht möglich, daher erstmal ein screeni.

Ich komme einfach nicht mit folgender Aufgabenstellung zurecht und leider sind die Daten auch vom CRM her nicht vollständig gepflegt worden:

Brauche ganz dringend Hilfe ;-)


1. - Alle Kunden die sich im Jahr 2015 angemeldet haben und >= 4 mal eine Gebühr bezahlt haben sollen herausgefiltert werden.

Wenn das Gebührfeld leer ist, dann war die Veranstaltung kostenlos und soll nicht mitgezählt werden, Sowie wenn das Datum zu bezahltAM leer ist, dann muss dieser Kunde auch ausgeschlossen bleiben.


2. - Alle Kunden die sich im Jahr 2015 angemeldet haben und <=3 mal eine Gebühr bezahlt haben sollen herausgefiltert werden

Wenn das Gebührfeld leer ist, dann war die Veranstaltung kostenlos und soll nicht mitgezählt werden, Sowie wenn das Datum zu bezahltAM leer ist, dann muss dieser Kunde auch ausgeschlossen bleiben.


3. - Weder eine Anmeldung 2016 oder 2015 aber insgesamt >=5 mal eine Gebühr bezahlt haben sollen herausgefiltert werden.

Wenn das Gebührfeld leer ist, dann war die Veranstaltung kostenlos und soll nicht mitgezählt werden, Sowie wenn das Datum zu bezahltAM leer ist, dann muss dieser Kunde auch ausgeschlossen bleiben.


4. - Weder eine Anmeldung 2016 oder 2015 sollen herausgefiltert werden

P.S. Die Tabelle ist 3800 Sätze groß nicht die 17 aus dem Screenshot.
 
Zuletzt bearbeitet:
Werbung:
Hi akretschmer, danke dir für den Tipp... Lösung 4 kriege ich nun mit Where und LIKE oder BETWEEN hin.

Aber Lösunge 1 oder 2 komme ich so mal garnicht drauf, hast du hierzu ein Beispiel? VG
 
In etwa so:
Code:
SELECT Kd
FROM tabelle
WHERE Gebuehr IS NOT NULL
AND Gebuehr <> ''
AND bezahltAM IS NOT NULL
AND year(von) = 2015
GROUP BY Kd
HAVING count(*) >= 4
Gebühr VARCHAR ist ja eigentlich quatsch aber müsste so gehen. Wie du unter SQLite das Jahr aus "von" bekommst ist jetzt mal geraten, musst du schauen.
 
Hi ukulele, super danke für den Tipp!

Es klappt alles bis auf das HAVING COUNT:

SELECT Kd
From Jako
WHERE Gebuehr IS NOT NULL
AND bezahltAm IS NOT NULL
AND von LIKE '%2015%' OR von LIKE '%2016%'
GROUP BY Kd
HAVING COUNT (*)>= 4;

upload_2016-1-7_14-51-27.png
 
Klappt nicht heißt?
Code:
SELECT Kd
FROM Jako
WHERE Gebuehr IS NOT NULL
AND Gebuehr <> ''
AND bezahltAM IS NOT NULL
AND ( von LIKE '%2015%' OR von LIKE '%2016%' )
GROUP BY Kd
HAVING count(*) >= 4
Klammern haßt du auf jeden Fall vergessen.
 
Ich kriege jedesmal diese Meldung:
0 rows returned in 5ms from: SELECT Kd

FROM Jako

WHERE Gebuehr IS NOT NULL

AND bezahltAm IS NOT NULL

AND (von LIKE '%2015%' OR von LIKE '%2016%')

GROUP BY Kd

HAVING count (*) >= 4

Ohne das mir eine erfolgreiche Selektion angezeigt wird.
 
Habe nun dies hier probiert:

SELECT Kd, von, Gebuehr, bezahltAm
FROM Jako
WHERE Gebuehr NOT NULL
AND (bezahltAm LIKE '%2015%' OR bezahltAm LIKE '%2016%' OR bezahltAm LIKE '%2014%')
AND (von LIKE '%2015%' OR von LIKE '%2016%')
GROUP BY Kd
HAVING COUNT (Kd >= 4)

Das klappt soweit bis auf die Tatsache, dass ich die Kd nicht als duplicate oder der gleichen sehe? es wird immer nur 1 Datensatz pro Kd geliefert auch wenn dieser angeblich über 4 mal vorkommen soll??
 
Dann erfüllen eventuell keine Datensätze die Kriterien. Du kannst dir mit
Code:
SELECT *
FROM Jako
WHERE Gebuehr IS NOT NULL
AND Gebuehr <> ''
AND bezahltAM IS NOT NULL
AND ( von LIKE '%2015%' OR von LIKE '%2016%' )
ORDER BY Kd
ja mal angucken ob deine Daten überhaupt Treffer hergeben müssten.

Dein Select in Post #8 ist falsch und deine Schlussfolgerung auch. Bei GROUP BY müssen alle Spalten entweder gruppiert oder aggregiert werden => Syntaxfehler. HAVING count(Kd >=4) ist kein boolischer Ausdruck. Alles was in der Klammer steht, wird gezählt. Vermutlich zählt er hier nur Kunden, deren Kundennummer größer/gleich 4 ist. Er vergleicht diesen gezählten Wert aber mit nichts.

Und durch das GROUP BY siehst du auch jede Kd immer nur einmal, das ist der Sinn von GROUP BY.
 
Hi ukulele,

mit Excel habe ich das folgendermaßen gelöst:

1. Erstmal Standardfilter bei "von" und Gebuehr
2. eine zusätzliche Spalte Anzahl_Kd angelegt --> ZählenWenn(ganze Spalte, Suchkriterium Zelle Kd)
upload_2016-1-8_8-11-29.png

upload_2016-1-8_8-8-16.png

3. Autofilter gesetzt für --> Anzahl Kd die mehrmals vorkommen >= 4

Wie kann ich sowas in SQL lösen? über Joins?
 
Werbung:
Also wie bereits gezeigt bekommst du mit HAVING alle Kd-Nummern auf denen die Kriterien zutreffen. Willst du jetzt alle Datensätze zu diesen Kd-Nummern anzeigen ginge das über mehrere Wege, auch Join, aber auch so:
Code:
SELECT    *
FROM    Jako
WHERE    Kd IN (

SELECT    Kd
FROM    Jako
WHERE    Gebuehr IS NOT NULL
AND        Gebuehr <> ''
AND        bezahltAM IS NOT NULL
AND (    von LIKE '%2015%'
OR        von LIKE '%2016%' )
GROUP BY Kd
HAVING count(*) >= 4

        )
Willst du jetzt nicht alle Datensätze der betroffenen Kd-Nummern anzeigen sondern nur die, die z.B. auch Gebühren betreffen dann würde ich es so erweitern:
Code:
SELECT    *
FROM    Jako
WHERE    Gebuehr IS NOT NULL
AND        Gebuehr <> ''
AND        Kd IN (

SELECT    Kd
FROM    Jako
WHERE    Gebuehr IS NOT NULL
AND        Gebuehr <> ''
AND        bezahltAM IS NOT NULL
AND (    von LIKE '%2015%'
OR        von LIKE '%2016%' )
GROUP BY Kd
HAVING count(*) >= 4

        )
Wenn HAVING nicht funktioniert (ich kenne SQLite nicht gut, bei MSSQL würde es gehen), dann müsste man sich das eventuell basteln. Ich kann mir aber nicht vorstellen das SQLite kein HAVING kann. SQLite - HAVING Clause
 
Zurück
Oben