Laden...

komplizierten SQL-String

Erstellt von tööö vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.710 Views
T
tööö Themenstarter:in
92 Beiträge seit 2006
vor 17 Jahren
komplizierten SQL-String

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ööö

G
497 Beiträge seit 2006
vor 17 Jahren

€: ich sollte auch die letzten Sätze lesen...

42 Beiträge seit 2004
vor 17 Jahren

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ß

1.373 Beiträge seit 2004
vor 17 Jahren

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

T
tööö Themenstarter:in
92 Beiträge seit 2006
vor 17 Jahren

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ööö

A
3 Beiträge seit 2006
vor 17 Jahren

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ß

T
tööö Themenstarter:in
92 Beiträge seit 2006
vor 17 Jahren

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ööö

T
512 Beiträge seit 2006
vor 17 Jahren

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

T
tööö Themenstarter:in
92 Beiträge seit 2006
vor 17 Jahren

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!

1.373 Beiträge seit 2004
vor 17 Jahren

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