Abfrage mit Bedingungen

specklinsen

Neuer Benutzer
Beiträge
2
Hallo!

Ich finde seit über eine Woche keine Lösung für mein Abfrage-Problem.
Vielleicht kann mir ja jemand von Euch Profis weiterhelfen.

Ich habe folgendes Abfrageergebnis aus mehreren Tabellen:

LSID STATUS Name Ersteller Erstelldatum
1 1 start NULL NULL
4 3 Testrezeptur Thomas Lisker 2010-01-14 08:28:42.000
4 2 Testrezeptur Thomas Lisker 2010-01-14 08:28:42.000
5 2 Universalreiniger Horst Ehmann 2010-01-14 13:38:38.000
5 3 Universalreiniger Horst Ehmann 2010-01-14 13:38:38.000
7 3 Duschbad Alexander Liska 2010-01-14 14:32:57.000
7 2 Duschbad Alexander Liska 2010-01-14 14:32:57.000
8 2 Duschbad Horst Ehmann 2010-01-14 14:38:03.000
8 3 Duschbad Horst Ehmann 2010-01-14 14:38:03.000
9 2 Testcreme Franz Obig 2010-01-14 16:25:22.000
9 3 Testcreme Franz Obig 2010-01-14 16:25:22.000
10 3 Testcreme Franz Obig 2010-01-14 16:23:41.000
2004 3 Cremedusche Milch & Honig Gerda Dank 2016-02-01 15:30:16.000
2004 4 Cremedusche Milch & Honig Gerda Dank 2016-02-01 15:30:16.000
2005 3 Cremedusche Mandel Christine Jäger 2016-02-01 15:34:21.000
2006 3 Cremedusche Aloe Vera Josef Brückl 2016-02-01 16:04:36.000
2006 4 Cremedusche Aloe Vera Josef Brückl 2016-02-01 16:04:36.000

Darin gibt kann es vorkommen, daß für eine LSID 2 verschiedene Datensätze gibt, die sich nur im Feld Status unterscheiden können. Die Werte für Status können 1-4 annehmen.

Ich möchte nun daraus immer wenn eine LSID doppelt oder mehrfach in der Abfrage aufscheint folgendes machen:
1) wenn bei einem der Datensätze der Status 1 oder 2 vorkommt den jeweils kleineren auswählen und alle anderen nicht
UND wenn dies nicht der Fall ist dann zusätzlich
2) immer nur den Datensatz auswählen der den größeren Status hat wenn der Status 3 oder 4 ist.

Ich habe auf unzählige Arten versucht das Problem anzugehen, scheitere aber wieder...
Ich bitte um Eure Hilfe und bin für jede Meldung dankbar!!!

mfg,
specklinsen
 
Zuletzt bearbeitet:
Werbung:
Mal so als grober Ansatz. Du hast:

Code:
test=*# select * from specklinsen ;
 lsid | status |  val  
------+--------+-------
  1 |  1 | val1
  1 |  2 | val2
  1 |  3 | val3
  2 |  1 | val4
  2 |  2 | val5
  2 |  3 | val6
  2 |  4 | val7
  3 |  3 | val8
  4 |  3 | val9
  4 |  4 | val10
  5 |  1 | val11
  5 |  2 | val12
(12 Zeilen)

M$SQL kann auch WITH-Abfragen, damit baust Du Dir erst einmal eine Tabelle, wo du zählst, wie viele Kombinationen von lsid es gibt, und was jeweils min und max für den Status ist. Etwa so:

Code:
test=*# with foo  as (select lsid, min(status), max(status), count(status) from specklinsen group by lsid) select * from foo;
 lsid | min | max | count
------+-----+-----+-------
  4 |  3 |  4 |  2
  1 |  1 |  3 |  3
  5 |  1 |  2 |  2
  3 |  3 |  3 |  1
  2 |  1 |  4 |  4
(5 Zeilen)

Darauf basierend kannst Du dann Deine Regeln als eigene Abfragen machen. So liefert Dir dies schon mal alle, die nur einmal vorkommen:

Code:
test=*# with foo as (select lsid, min(status), max(status), count(status) from specklinsen group by lsid) select * from specklinsen where lsid in (select lsid from foo where count = 1);
 lsid | status | val  
------+--------+------
  3 |  3 | val8
(1 Zeile)

Falls status = 1 und 2 vorkommt:

Code:
test=*# with foo as (select lsid, min(status), max(status), count(status) from specklinsen group by lsid) select * from specklinsen where lsid in (select lsid from foo where count > 1 and max=2) and status = 1;
 lsid | status |  val  
------+--------+-------
  5 |  1 | val11
(1 Zeile)

Suche nun noch passende Regeln für die anderen Fälle, und kombiniere die einzelnen Abfragen mit UNION :

Code:
with foo as (select lsid, min(status), max(status), count(status) from specklinsen group by lsid) select * from specklinsen where lsid in (select lsid from foo where count = 1) union all select * from specklinsen where lsid in (select lsid from foo where count > 1 and max=2) and status = 1;
 lsid | status |  val  
------+--------+-------
  3 |  3 | val8
  5 |  1 | val11
(2 Zeilen)

Du siehst den Weg?
 
Werbung:
Wie wärs mit
Code:
SELECT  LSID,Name,Ersteller,Erstelldatum,
     isnull(min(CASE WHEN STATUS BETWEEN 1 AND 2 THEN STATUS ELSE NULL END),max(STATUS)) AS STATUS
FROM   t
GROUP BY LSID,Name,Ersteller,Erstelldatum
 
Zurück
Oben