Kombinatorik mit SQL ?

Hallo,

ich stehe grade kpl. auf dem Schlauch. Eigentlich ein relativ einfaches Problem aber mir fehlt die Idee.

Ich habe eine Tabelle

ID a b c
01 1 0 2
02 2 1 0
03 0 1 3
04 1 4 2

Nun möchte ich in einer Abfrage alle Kombinationen aus Zeilen finden deren Spaltensumme einen gewünschten Wert hat. Also z.B. alle Zeilen für die gilt SUM(a) == 2 ergäbe

Zeile 2
Zeile 1,4

Hat jemand einen Tip zur Lösung ?

Vielen Dank

SvenOfNine

Hallo Sven,

ich gehe mal davon aus, dass du wirklich nur die Summe brauchst und keine Kombinatorik:

select * from tabelle where a+b+c = 2

(ggfs. muss man die Typen in a, b, c umwandlen und sicherstellen, dass kein null drin ist …)

mfg

Dirk.Pegasus

ich stehe grade kpl. auf dem Schlauch. Eigentlich ein relativ
einfaches Problem aber mir fehlt die Idee.

Ich habe eine Tabelle

ID a b c
01 1 0 2
02 2 1 0
03 0 1 3
04 1 4 2

Nun möchte ich in einer Abfrage alle Kombinationen aus Zeilen
finden deren Spaltensumme einen gewünschten Wert hat. Also
z.B. alle Zeilen für die gilt SUM(a) == 2 ergäbe

Zeile 2
Zeile 1,4

Hat jemand einen Tip zur Lösung ?

Vielen Dank

SvenOfNine

Hallo Dirk,

ich gehe mal davon aus, dass du wirklich nur die Summe
brauchst und keine Kombinatorik:

doch. Ich möchte gerade alle verschiedenen Möglichkeiten fur sum(a)==2 ermitteln.

Ciao
SvenOfNine

Hallo Sven,

Also alle Zeilen bei denen a oder b oder c = 2?

select * from tabelle wehre a=2 or b=2 or c=3

Oder verstehe ich dich immernochnicht?

mfg

Dirk.Pegasus

Moin,

ich glaub du wirst nicht verstanden, weil die Anfrage eigentlich nichts mit SQL zu tun hat - eine solche Logik ist imho - zumindest mit simpler Abfrage - nicht möglich!

Es wird dir wohl nichts anderes übrig beliben als schlicht alle Daten zu laden und die Logik im Programmcode zu implementieren. Ginge vermutlich auch mit T-SQL (oder halt die passende Programmiersprache der DB), doch ist dies wenig sinnvoll, da Datenbankprogrammierung eher nicht gedacht ist für die Abbildung komplexer Logiken…

Gruß

Bernd

Hi Sven,

ist die Anzahl der Summanden irgendwie einschränkbar oder kann eine gewünschte Summe aus beliebig vielen Zeilen gebildet werden?

In letzterem Fall kommst Du meiner Meinung nach um ein Programm nicht herum, wenn es immer nur ein oder zwei Summanden sein können, dann geht der hier:

SELECT TO\_CHAR(x.ID)
 FROM myTab x 
 WHERE x.a = 2 UNION
SELECT TO\_CHAR(y.ID) ||','|| TO\_CHAR(z.ID)
 FROM myTab y, myTab z 
 WHERE (y.a + z.a) = 2;

Das kannst Du natürlich beliebig erweitern, aber vorsicht: Du bildest hier im zweiten Select ein kartesisches Produkt, das hat bei nur 100 Sätzen in der Tabelle schon 10.000 Sätze für die Zweierkombination, für die Dreierkombination sinds im Produkt 1.000.000 - ich schätze Du wirst bei nennenswert großen Tabellen recht schnell die Limits der DB erreichen (Du hast übrigens vergessen zu erwähnen, welche Du verwendest).

Wie schon angemerkt wurde: Für solche Aufgaben sind Datenbanken nicht konzipiert, ein hübsches (und eigentlich recht einfaches) C - Programm ist da sicher die bessere Wahl.

Gruß
Martin