Hi,
ich bin langsam mit meinem SQL-Kenntnissen am Ende.
Ich versuche mein Problem mal etwas verkleinert darzustellen. Ich habe eine Tabelle mit folgenden Spalten:
Vorname, Nachname, Position
Nun möchte ich von jeder Person die Anzahl haben, wo Position = 1 ist. (1 = Sieg). Also ich möchte für jede Person die Anzahl der Siege haben. Folgendes habe ich probiert:
SELECT Vorname,Nachname,Position, Sum(1) AS AnzahlSiege FROM t_Positionierung GROUP BY Vorname, Nachname, Position HAVING Position=1
In der selbstdefinierten Spalte "AnzahlSiege" sollen dann die Anzahl der Siege stehen 😉 Das geht auch soweit.
Problem ist nur, dass er nur die Datensätze ausgibt, wo auch die Person mindestens einmal bei Position eine 1 zu stehen hat.
Ich möchte aber nun alle Personen ausgeben und wenn diese eben keinen Sieg haben, soll da eine 0 stehen.
Kann mir da vielleicht einer weiterhelfen? Ich wäre sehr dankbar.
Gruß
tööö
Hallo der Ansatz ist nicht schlecht versuch doch mal folgendes:
SELECT Vorname,Nachname, count(*) AS AnzahlSiege
FROM t_Positionierung
Where Position=1
GROUP BY Vorname, Nachname HAVING count(*)>1
Wenn ich die Frage richtig verstanden habe müsste das passten
Gruß
Hallo,
SELECT Vorname, Nachname, COUNT(*) AS AnzahlSiege
FROM t_Positionierung
WHERE (Position = 1)
GROUP BY ALL Vorname, Nachname
Wichtig ist das "ALL", weil es auch leere Gruppen einschließt.
Viele Grüße,
Andre
Hi,
erstmal danke für eure Antworten. Beide Vorschläge führen leider nicht zum Ergebnis. Ich probiere das immer testweise in Access aus. Meine Datenbank ist nämlich in Access. Zugreifen tu ich darauf dann mit C#.
@Horego:
Deine Version liefert leider dasselbe Ergebnis wie meine.
@VizOne:
Deine Version gibt folgenden Fehler aus:
Syntaxfehler (fehlender Operator) in Abfrageausdruck 'ALL Vorname'
Hab auch rumprobiert, aber bekomme es alleine irgendwie nicht gebacken.
Ich hoffe, ihr habt nochmal die Geduld mir zu helfen 🙂
Gruß
tööö
Hmm ... kann doch eigentlich auch nicht funktionieren, weil "where Position = 1". Du selektierst doch nur die Personen, die schon mindestens einen Sieg verbuchen konnten. Oder hab ich grad einen Knoten im Hirn? 🙂
Kann Dir jetzt erstmal keinen Code liefern ... aber nach meinem Verständnis mußt Du erstmal alle selecten und dann nur die summieren, die Position = 1 haben. Das sollte mit einem geschachtelten Select funktionieren.
Alternativ holst Du Dir alles erstmal über DS und führst die Operationen mittels C# aus.
Schönen Gruß
Alternativ holst Du Dir alles erstmal über DS und führst die Operationen mittels C# aus.
Hi,
daran hab ich auch schon gedacht, ist dann aber glaube ich von der Performance her langsamer, als wenn man das gleich alles in SQL verarbeiten kann.
Hinbekommen hab ich das jetzt erstmal so:
SELECT Vorname,Nachname, Sum(0) AS AnzahlSiege FROM t_Positionierung WHERE [Position]>1 GROUP BY Vorname, Nachname UNION SELECT Vorname, Nachname, Sum(1) AS AnzahlSiege FROM t_Positionierung GROUP BY Vorname, Nachname, [Position] HAVING [Position]=1 ORDER BY AnzahlSiege DESC
Sieht ziemlich schrecklich aus, glaube ich g Sind nun zwei SQL-Anweisungen verknüpft.
Ich hab noch mehr solcher Fälle, wo ich so kompliziert selektieren muss, aber das mach ich dann wohl auch eher mithilfe einer Funktion in C#. Ist denk ich dann auch einfacher 😉
Gruß und Danke
tööö
Müsste nicht der Trick klappen?
SELECT Vorname,Nachname, Sum(Floor(1/Position)) AS AnzahlSiege
FROM t_Positionierung GROUP BY Vorname, Nachname
Wenn du schon ein UNION machst, warum nicht einfach 0 statt Sum(0) 😁
e.f.q.
Aus Falschem folgt Beliebiges
Hi,
ich würd das UNION auch gerne umgehen, weiß ja nur nicht wie g
Dein SQL-Befehl mag irgendwie nicht gehen. Der hat wohl Probleme mit dem "Floor".
edit:
Super, so gehts nun:
SELECT Vorname, Nachname, Sum(Round((1/[Position]),0)) AS AnzahlSiege FROM t_Positionierung GROUP BY Vorname, Nachname
Dank deiner/eurer Hilfe ist der SQL-String ja doch noch sehr geschrumpft 😉
Besten Dank!
Hallo,
OK, mein Fehler. Das mit dem ALL scheint nur beim SQL Server zu funktionieren (dort führt es aber zum gewünschten Ergebnis!)
Grüße,
Andre