2016-06-01 6 views
2

Ich habe eine Tabelle, die Ergebnisse nach Sport und Start-und Enddaten und Gewinn/Verlust-Ergebnis auflistet. Ich muss den Prozentsatz der Gewinne pro Sport pro Saisonstart berechnen. Dies ist meine Tabelle:Wie Prozentsätze in Tsql mit einer Gruppe nach Abfrage berechnen?

table1 
****** 
id sport won playerid  season_start season_end updated_date 
--- ----- ---- --------  ------------ ------------ ------------ 
1  rugby Y kato23  2016-01-01  2016-01-31 2016-02-01 
2  rugby Y king54  2016-01-01  2016-01-31 2016-02-01 
3  rugby N robby1  2016-03-01  2016-03-28 2016-04-01 
4  rugby Y kelly2  2016-03-01  2016-03-28 2016-04-01 
5  soccer Y kato23  2016-01-01  2016-01-31 2016-02-01 
6  soccer Y jeri44  2016-01-01  2016-01-31 2016-02-01 
7  soccer N matt24  2016-06-01  2016-06-30 2016-07-01 
8  tennis Y kray43  2016-01-01  2016-01-31 2016-02-01 
9  tennis Y jeri44  2016-01-01  2016-01-31 2016-02-01 
10 tennis N jeri44  2016-01-01  2016-01-31 2016-02-01 

So würde Ich mag eine Abfrage auszuführen, die folgendes Ergebnis erzeugt:

sport  season_start  success_percent 
-----  ------------  --------------- 
rugby  2016-01-01  100.00 
rugby  2016-03-01  50.00 
soccer 2016-01-01  100.00 
soccer 2016-06-01  0.00 
tennis 2016-01-01  66.66 

Ich habe versucht:

select sport,won, season_start, count(sport) as sportcount 
from table1 where won = 'Y' 
group by sport, won, season_start 

Aber gib mir nur die Gesamtzählung, aber nicht der tatsächliche Erfolgsprozentsatz. Ich habe versucht, case statement zu verwenden, aber ich bin nicht gut mit tsql, oder mit 'Sum', um die Gewinne und die Verluste zu zählen und dann den Gewinnprozentsatz von der Gesamtsumme zu berechnen.

Kann jemand eine Tsql-Abfrage bereitstellen, die das tut?

Antwort

1

können Sie bedingte Zählungen für diese verwenden:

select sport, season_start, 
     sportcount = count(case when won = 'Y' then 'X' end) * 100.0/count(*) 
    from table1 
group by sport, season_start 
+0

das sieht nicht richtig aus - es gibt mir jetzt 100 oder 0, was nicht richtig ist –

+0

Entschuldigung, mein Fehler - ich gruppiert auf gewann auch, weshalb es versaut war! Warte, lass mich nachsehen, werde dich in Kürze updaten. –

+0

OK Ich habe ein Problem - ich muss updated_date als eine der Spalten in der Ergebnismenge einschließen, aber wenn ich updated_date in der Auswahl- und in der Gruppe hinzufügen, ist das Ergebnis deaktiviert - es werden auch zusätzliche Zeilen eingefügt . Wie kann ich die update_date-Spalte in der Ergebnismenge hinzufügen, ohne die Ergebnismenge zu verfälschen? –

1

Bitte versuchen Sie die folgende Abfrage:

SELECT sport, season_start, 
     (CAST(COUNT(CASE won WHEN 'Y' THEN '1' ELSE NULL END) AS DECIMAL(10,2)))/CAST(COUNT(*) AS DECIMAL(10,2)))*100 AS sportcount 
FROM table1 
GROUP BY sport, season_start 

In der Tat innerhalb der COUNT Aggregatfunktion überprüfen wir den Wert von Säule gewonnen und wenn es ist gleich "Y" wir werden es zählen, sonst werden wir es ignorieren. Wie Sie vielleicht wissen, ignoriert die Aggregationsfunktion count die NULL-Werte, so dass innerhalb der Zählung, wenn won nicht gleich 'Y' ist, wir einen NULL-Wert erzeugen, der den Count dazu bringt, ihn zu ignorieren. Nachdem wir die gewonnenen Zählungen gezählt haben, müssen wir sie einfach auf die Gesamtzahl der Übereinstimmungen pro Sport und Saison aufteilen (Zählung (*) zählt dies).

Sie haben in der Gruppe gewonnen gewonnen, das wird ein Problem verursachen. Jeder Datensatz mit derselben Gruppe wird nur einmal in der Ergebnismenge angezeigt. Wenn Sie in Ihrer Auswahlliste gewinnen müssen, können Sie die CROSS APPLY- oder Window-Aggregate-Funktionen ausprobieren. Wenn Sie es brauchen, bitte aktualisieren Sie Ihre Frage und danach werde ich meine Antwort darauf aktualisieren.

Bitte beachten Sie, dass Sie die Prozentberechnung teilweise in den Dezimal- oder Zahlen- oder etc-Datentyp umwandeln müssen, wenn Sie das genaue Ergebnis benötigen (deshalb habe ich beide Zähler auf DECIMAL gesetzt).

+0

Ihr Kommentar ist genau richtig! Ich habe eine Konvertierung durchgeführt, um in Dezimal zu konvertieren. Was NULL anbelangt, wird die gewonnene Spalte niemals Null haben, also sind wir damit abgedeckt.Ich werde weitermachen und einen Punkt für Ihre Antwort vergeben, nicht sicher, wie das geht. –

+0

@DamonMatt Drücken Sie einfach den "Pfeil nach oben" neben meiner Antwort, wenn Sie es hilfreich fanden –