Benutzer mit den meisten Antworten
Kombinationen selektieren

Frage
-
Hallo allerseits!Ich habe eine Tabelle "OKM", die so aussieht:PersonID A N V W-------- - - - -1040 N J J N1041 N J N N1042 J N N N1043 N J N JPersonID ist dabei der Primary Key, die übrigen Felder sind J/N-Flags. Ausdieser Tabelle soll ich nun Personen für eine statistische Auswertung nachverschiedenen Kriterien selektieren. Diese sind in einer Tabelle "Basis"definiert:BasisID Beschreibung------- -----------------1 Alle2 Mit N3 Ausschließlich ADas gewünschte Ergebnis sieht dann so aus:BasisID PersonID------- --------1 10401 10411 10421 10432 10402 10412 10433 1042Um das Ganze in einem SELECT-Statement erledigen zu können, habe ich eineTabelle "Flags" definiert, die zu jeder BasisID alle erlaubten Kombinationen vonA, N, V und W enthalten. Das SELECT-Statement sieht dann so aus:SELECTB.BasisID,O.PersonIDFROMOKM OINNER JOIN Flags FON F.A = O.AAND F.N = O.NAND F.V = O.VAND F.W = O.WINNER JOIN Basis BON B.BasisID = F.BasisID;Das funktioniert zwar, bei steigender Anzahl Zeilen in Basis (derzeit 18) wirddas Ganze recht unübersichtlich. Hat irgendjemand eine Idee für einenwartungsfreundlicheren Lösungsansatz?TIAGrüßeThomas--Any problem in computer science can be solved with another layerof indirection. But that usually will create another problem.David Wheeler
Antworten
-
Nur mal ein unausgegorener Gedanke:
wie wäre es, wenn Du die J/N-Werte als Bitmask umdefinierst:
NJJN = 4*8
NJNN = 4
JJJJ = 2*4*8*16Damit hättest Du jede Kombination als Wert vorliegen und könntest entsprechend selektieren.
- Als Antwort vorgeschlagen Falk Krahl Montag, 21. November 2011 21:19
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 23. November 2011 16:56
-
Hallo Thomas, hier ist noch mal Christa's Ansatz etwas verfeinert!
Declare @Personen as Table(PersonID integer, A char(1), N char(1), V char(1), W char(1), Mask integer); Declare @Basis as Table(BasisID integer, Beschreibung varchar(100), Mask integer); Insert into @Personen(PersonID, A, N, V, W, Mask) values(1040, 'N', 'J', 'J', 'N', 6); Insert into @Personen(PersonID, A, N, V, W, Mask) values(1041, 'N', 'J', 'N', 'N', 2); Insert into @Personen(PersonID, A, N, V, W, Mask) values(1042, 'J', 'N', 'J', 'N', 1); Insert into @Personen(PersonID, A, N, V, W, Mask) values(1043, 'N', 'J', 'N', 'J', 10); Insert into @Basis(BasisID, Beschreibung, Mask) values(1, 'Alle', 15); Insert into @Basis(BasisID, Beschreibung, Mask) values(2, 'Mit N', 2); Insert into @Basis(BasisID, Beschreibung, Mask) values(3, 'Ausschließlich A', 1); Select * from @Personen where Mask &2 = 2; Select b.BasisID, b.Beschreibung, p.PersonID from @Personen p , @Basis b where p.Mask & b.Mask <> 0;
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP
www.insidesql.org/blogs/cmu- Bearbeitet Christoph Muthmann Donnerstag, 17. November 2011 07:11 Formatierung
- Als Antwort vorgeschlagen Falk Krahl Montag, 21. November 2011 21:19
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 23. November 2011 16:56
Alle Antworten
-
Nur mal ein unausgegorener Gedanke:
wie wäre es, wenn Du die J/N-Werte als Bitmask umdefinierst:
NJJN = 4*8
NJNN = 4
JJJJ = 2*4*8*16Damit hättest Du jede Kombination als Wert vorliegen und könntest entsprechend selektieren.
- Als Antwort vorgeschlagen Falk Krahl Montag, 21. November 2011 21:19
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 23. November 2011 16:56
-
Hallo Thomas, hier ist noch mal Christa's Ansatz etwas verfeinert!
Declare @Personen as Table(PersonID integer, A char(1), N char(1), V char(1), W char(1), Mask integer); Declare @Basis as Table(BasisID integer, Beschreibung varchar(100), Mask integer); Insert into @Personen(PersonID, A, N, V, W, Mask) values(1040, 'N', 'J', 'J', 'N', 6); Insert into @Personen(PersonID, A, N, V, W, Mask) values(1041, 'N', 'J', 'N', 'N', 2); Insert into @Personen(PersonID, A, N, V, W, Mask) values(1042, 'J', 'N', 'J', 'N', 1); Insert into @Personen(PersonID, A, N, V, W, Mask) values(1043, 'N', 'J', 'N', 'J', 10); Insert into @Basis(BasisID, Beschreibung, Mask) values(1, 'Alle', 15); Insert into @Basis(BasisID, Beschreibung, Mask) values(2, 'Mit N', 2); Insert into @Basis(BasisID, Beschreibung, Mask) values(3, 'Ausschließlich A', 1); Select * from @Personen where Mask &2 = 2; Select b.BasisID, b.Beschreibung, p.PersonID from @Personen p , @Basis b where p.Mask & b.Mask <> 0;
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP
www.insidesql.org/blogs/cmu- Bearbeitet Christoph Muthmann Donnerstag, 17. November 2011 07:11 Formatierung
- Als Antwort vorgeschlagen Falk Krahl Montag, 21. November 2011 21:19
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 23. November 2011 16:56