exklusives "Having"

spitfire_ch

New Member
Hallo,

mir sitzt irgendwer auf der Leitung, zumindest komm ich selbst momentan nicht auf die Lösung und wäre sehr dankbar für Eure Hilfe. Die Situation ist folgende:

Pro Kunde gibt es mehrere Karten, die individuell gültig oder ungültig sein können. Ich soll nun alle Kunden heraussuchen, die mehr als eine gültige Karte besitzen. Mein bisheriger Ansatz:
Code:
select K.kunden_id, count(distinct K.karten_id) 'Anzahl Karten'
from jemas_data..karte K, jemas_data..kunde U
where K.kunden_id = U.kunden_id
and kartenstatus in (11, 12)         -- gültige Kartenstati
and kundenstatus in (11, 12, 29)  -- gültige kundenstati
group by K.kunden_id
having count(distinct K.karten_id) > 1
Das Problem: so werden auch jene Kunden aufgelistet, die zwar mehr als eine Karte haben, aber nur eine davon gültig ist. Wie muss ich muss ich die Frage formulieren, damit mit Count nicht alle Karten sondern nur die gültigen Karten gezählt werden? Also trivial gesagt möchte ich folgendes:

count(distinct "gültige" K.karten_id)

Vermutlich wär die Lösung ganz einfach :)

Vielen herzlichen Dank

- spitfire
 
Last edited by a moderator:
Versuch mal, das über einen Subselect zu machen.

Code:
SELECT
  ...,
  EXISTS(SELECT 1 FROM table WHERE kartenstatus IN (<gültige status>) AND kunden_id=kunden_id) AS gueltige_karten
FROM ...
  ...
HAVING gueltige_karten
Oder so. EXISTS(SELECT ...) sollte dann einen Bool liefern, der anzeigt, ob der Kunde gültige Karten hat.
 
Last edited by a moderator:
Eine andere Idee hätte ich noch:

Du könntest zusätzlich einen LEFT JOIN der Kartentabelle auf sich selbst machen und nur Karten zulassen, die gültig sind. (Als Join-Kriterien die Karten-ID plus den Status.) Dann Selectest du die Karten-ID der gejointen Table in das Ergebnis.
Dann hast du in der Ergebnisspalte entweder eine Karten-ID oder NULL. Dann kannst du Goupen nach "HAVING (gueltige_karte IS NOT NULL)".

Welche Variante besser performt und billiger ist, müsstest du ausprobieren und per Query-Analyzer ergründen.
 
Last edited by a moderator:
Back
Top