Abfrage mit Kombinationen

OzziT

Neuer Benutzer
Beiträge
3
Hallo zusammen, ich möchte eine Abfrage machen bei der ich verdammich nicht weiter komme.
Aus einer Tabelle mit Datum und eingepflegte Position möchte ich die Personen rausziehen, die bestimmte Positionen innehaben. Zum Beispiel:

Tabelle Einsatz
NamePosition
HansDönerbude
JürgenPommesstand
WalterSchnitzelbar

Ich ziehe hier die Leute für den Tag raus, die in der Dönerbude oder im Pommesstand arbeiten.
Nun möchte ich aus einer weiteren Tabelle die Skilllevel dieser Personen rausziehen und mir mögliche Kombinationen anschauen. Die andere Tabelle sieht dann zB wie folgt aus:

Tabelle Skill
NameFähigkeitLevel
HansDöner3
HansPommes4
HansSchnitzel2
JürgenDöner2
JürgenPommes5
JürgenSchnitzel4
WalterSchnitzel3

Jetzt habe ich zum Beispiel folgenden Code:
SELECT DISTINCT
SUM(Case when (Skl.Fähigkeit = 'Döner and Skl.Level > 2) and (Skl.Fähigkeit = 'Pommes' and Skl.Level <= 2) and (Skl.Fähigkeit = 'Schnitzel' and Skl.Level <= 2) Then 1 Else 0 End) as Döner
SUM(Case when (Skl.Fähigkeit = 'Döner and Skl.Level > 2) and (Skl.Fähigkeit = 'Pommes' and Skl.Level > 2) and (Skl.Fähigkeit = 'Schnitzel' and Skl.Level <= 2)Then 1 Else 0 End) as Döner/Pommes
SUM(Case when (Skl.Fähigkeit = 'Döner and Skl.Level > 2) and (Skl.Fähigkeit = 'Pommes' and Skl.Level <= 2) and (Skl.Fähigkeit = 'Schnitzel' and Skl.Level > 2) Then 1 Else 0 End) as Döner/Schnitzel
SUM(Case when (Skl.Fähigkeit = 'Döner and Skl.Level <= 2) and (Skl.Fähigkeit = 'Pommes' and Skl.Level > 2) and (Skl.Fähigkeit = 'Schnitzel' and Skl.Level > 2) Then 1 Else 0 End) as Pommes/Schnitzel
SUM(Case when (Skl.Fähigkeit = 'Döner and Skl.Level > 2) and (Skl.Fähigkeit = 'Pommes' and Skl.Level > 2) and (Skl.Fähigkeit = 'Schnitzel' and Skl.Level > 2) Then 1 Else 0 End) as Döner/Pommes/Schnitzel
FROM Einsatz as Eins
LEFT JOIN Skill as Skl ON Eins.Name = Skl.Name
WHERE Eins.Position LIKE 'Dönerbude' OR Eins.Position LIKE 'Pommesstand'

Ziel wäre dann eine Tabelle zu haben, die so aussieht

DönerDöner/PommesDöner/SchnitzelPommes/SchnitzelDöner/Pommes/Schnitzel
01010

Hier wurden jeztt nur Jürgen und Hans berücksichtigt und ihre Skills nach den folgenden Kombinationen geschaut.
Funktioniert aber nicht. Ich vermute, dass es an der Case when liegt, die keine mehrere Zeilen anschauen kann und als AND kombinieren kann. Anderes Problem ist natürlich auch, dass meine richtige Tabelle viel größer ist und aus viel mehr Positionenen und Fähigkeiten besteht.
Ich müsste das iwie dynamisch gestalten, wofür mir das Know-How fehlt.
Hat jemand eine einfache Idee?
 
Werbung:
Wenn du etwas filter willst, gehört es in die Where clause.
Lass mal das Case weg, das ist nur Darstellung.
Filter in where so, dass Du auf eine bestimmte, übersichtliche, bekannte Menge kommst.
Z. B. 4 Skills an einem Tag.
So, dass es einfach zählbar ist.

Dahinter filters du dann auf verschiedene Kombinationen.

Wenn dass alles passt, baust du ein Case ein.
Oder ein Pivot
 
Hört sich alles sehr logisch an, kann mir aber tatsächlich ncihts darunter vorstellen. Kannst du ein ganz kurzes sinnhaftes Beispiel geben?
 
Nein, bin grad per Handy online.
Das Case Statement zu entfernen, stattdessen die darin genutzten Spalten ausgeben, das kriegst du hin.
Die Where Bedingung so zu erweitern, dass exakt das erwartete Ergebnis rauskommt, kannst du auch schaffen.
Ansonsten kannst du auch erläutern, was "funktioniert aber nicht" genau bedeutet.

Kommt eine Fehlermeldung? Welche?
Unplausibles Ergebnis? Warum?
Gar kein Ergebnis?

...
 
Dein CASE ist auch falsch, umgestellt steht da sinngemäß
CASE WHEN Skl.Fähigkeit = 'Döner' AND Skl.Fähigkeit = 'Pommes' [...]
WHEN wird also nie wahr. Hier müsste ein OR rein.

Vermutlich wolltest du auch an dieser Stelle die Fähigkeiten aggregiert betrachten, dann müsstest du tatsächlich im ersten Schritt aggregieren. Denn das CASE bezieht sich nur auf die eine Zeile, es weiß nicht, ob in einer anderen Zeile auch noch eine Fähigkeit existiert.

Ich würde dafür gerne einen besseren Vorschlag ersinnen, aber mir ist noch nicht klar, wo du eigentlich hin willst. Du sagst selbst, du hast mehr als drei Fähigkeiten, willst du wirklich alle erdenklichen Paare bilden und als Spalte ausgeben? Das kann doch eigentlich nicht sinnvoll sein, deine Spaltenanzahl steigt dann exponentiell zu der Anzahl an Fähigkeiten...
 
Dein CASE ist auch falsch, umgestellt steht da sinngemäß
CASE WHEN Skl.Fähigkeit = 'Döner' AND Skl.Fähigkeit = 'Pommes' [...]
WHEN wird also nie wahr. Hier müsste ein OR rein.

Vermutlich wolltest du auch an dieser Stelle die Fähigkeiten aggregiert betrachten, dann müsstest du tatsächlich im ersten Schritt aggregieren. Denn das CASE bezieht sich nur auf die eine Zeile, es weiß nicht, ob in einer anderen Zeile auch noch eine Fähigkeit existiert.

Ich würde dafür gerne einen besseren Vorschlag ersinnen, aber mir ist noch nicht klar, wo du eigentlich hin willst. Du sagst selbst, du hast mehr als drei Fähigkeiten, willst du wirklich alle erdenklichen Paare bilden und als Spalte ausgeben? Das kann doch eigentlich nicht sinnvoll sein, deine Spaltenanzahl steigt dann exponentiell zu der Anzahl an Fähigkeiten...

Du hast es eigentlich erfasst. Genau das ist eigentlich echt das größte Problem. Laut meiner Berechnung hätte ich dadurch 180 mögliche Kombinationen und somit Spalten. Meine Vision wird dadurch eher zu einem Problem..
 
Werbung:
Du musst die verschiedenen Fähigkeiten bewerten, eventuell mit Gewichtung. Du hast eine Fähigkeit z.B. Döner und ein Level, was die Ausprägung beschreibt. Das gleiche hast du für Pommes. Jetzt könnte man sagen 5 bei Döner + 5 bei Pommes ergibt 5 im Durschnitt, oder 10 in der Summe oder 1 Döner gleich 2 Pommes, dann sind es 5 + 2,5 = 7,5. Aber am Ende musst du wissen wie viele Pommes einem Döner ebenbürtig sind oder ob man das einfach gar nicht vergleichen kann.

Alternativ kannst du es auch in eine Reihe packen, wie eine Kodierung, um es darzustellen. Dann muss aber jeder wissen welche Stelle in der Kodierung was bedeutet, oder du belässt es bei einzelnen Spalten. Ich könnte mir auch etwas vorstellen wie:
Code:
avg(CASE WHEN Skl.Fähigkeit = 'Döner' THEN Skl.Level ELSE NULL END) AS fähigkeit_döner,
avg(CASE WHEN Skl.Fähigkeit = 'Pommes' THEN Skl.Level ELSE NULL END) AS fähigkeit_pommes,
...
PS: Natürlich gruppiert nach Person.

PPS: Bei Olympia wird im Medaillenspiegel auch nicht nach Summe Medaille gerechnet, sondern es wird absteigend sortiert und jede Medaillenart gesondert ausgegeben. Die Sportart hingegen spielt am Ende keine Rolle mehr, die sind alle gleichwertig. Du könntest also sagen höchstes Level bei Döner und Pommes entspricht 2x Gold + 1x Silber für ein mittleres Level bei Schnitzel.
 
Zuletzt bearbeitet:
Zurück
Oben