2017-06-29 5 views
-1

Ich brauche Hilfe, die Summe einer Gruppe in SQL. Dies ist die Tabelle, die ich habe:SQL-Summe einer Gruppe

Sport   NumberOfPlayers 
soccer   10 
football  5 
football  11 
baseball  6 
Tennis   8 

Das ist, was ich es haben wollen wie folgt aussehen:

Sport   NumberOfPlayers  SumOfSport 
soccer    10     15 
football   5     16 
football   11     16 
baseball   6     6 
Tennis    8     8 
soccer    5     15 
+1

Bitte zeigen: Wie haben Sie weit gekommen? Was hast du probiert? – DaniDev

+0

können Sie die Frage bitte mit dem RDBMS markieren, das Sie verwenden, wenn möglich. Es gibt syntaktische Unterschiede zwischen ihnen. – Turophile

+0

Wo ist Ihre Anfrage? – Eric

Antwort

0

Erstellen Sie eine Tabelle, die die Gesamtzahl der Spieler für jede Sportart hält und nennen es sumPlayer (oder was auch immer du magst). Dann nehmen Sie Ihre Tabelle mit SumPlayer beitreten.

CREATE TABLE sport(
    sport_name varchar(10), 
    numberOfPlayers int 
) 

INSERT INTO sport (sport_name, numberOfPlayers) 
VALUES ('soccer', 10), 
('football', 5), 
('football', 11), 
('baseball', 6), 
('Tennis', 8), 
('soccer', 15) 

SELECT sport.sport_name, sumPlayer.totalPlayer 
FROM sport LEFT JOIN (
    SELECT sport_name, SUM(numberOfPlayers) AS totalPlayer 
    FROM sport 
    GROUP BY sport_name) sumPlayer ON sumPlayer.sport_name = sport.sport_name 

dann sieht das Ergebnis wie folgt aus:

sport_name numberOfPlayers 
soccer  10 
football 5 
football 11 
baseball 6 
Tennis  8 
soccer  5 

hoffe, das hilft, sollten Sie die GROUP BY statement Kasse. In einem sehr allgemeinen Sinne, wenn Sie Aggregatfunktionen wie (COUNT, MAX, MIN, SUM, AVG) verwenden möchten, sollte GROUP BY Ihr erster sein.

1

Verwenden Sie eine CROSS APPLY-Anweisung, um eine Aggregation der Spieler in jeder Reihe der Sporttabelle nach Sport zu gruppieren, wobei die Ergebnisse der CROSS APPLY mit einer WHERE-Klausel gefiltert werden, um nur die Aggregation der ersten Abfrage der Sportart zurückzugeben in der OUTER APPLY ist das gleiche wie in der ersten Abfrage.

SELECT * FROM 
(SELECT a.Sport, a.NumberOfPlayers FROM SportTable) as a 

CROSS APPLY 

(
SELECT Sum(b.NumberOfPlayers) as SumOfSport 
FROM SportTable as b 
WHERE a.Sport = b.Sport 
GROUP BY b.Sport 
) as b 
+0

Woher wissen Sie, dass Ozzy SQL Server verwendet? –

+0

Woher wissen Sie, dass Ozzy nicht SQL Server 2005 oder 2008 verwendet, die Fensterfunktionen nicht unterstützen? (Außer Ranking Fensterfunktionen). Er hat nicht angegeben, also gab ich ihm eine Antwort, die in SQL Server funktionieren wird. – wrslphil

+0

Zitat aus der Tag-Info für 'sql':" * Antworten auf mit SQL gekennzeichnete Fragen sollten ISO/IEC-Standard SQL * "verwenden. Fensterfunktionen sind seit fast 15 Jahren Teil des SQL-Standards. Eine Antwort mit Standard-SQL wird auf so ziemlich jedem [modernen DBMS] funktionieren (http://modern-sql.com/) –

0

Ein anderer Weg, dies zu tun, ist eine temporäre Tabelle # TEMP0 verwenden die temporäre Struktur, die Sie wollen, und verwenden Sie dann eine weitere Abfrage zu erstellen, die Summen zu aktualisieren:

SELECT [Sport] 
     ,[numberOfPlayers] 
     ,0 [SumOfSport] 
    INTO #Temp0  
    FROM Table1  

Update #Temp0 
SET [SumOfSport] = 
    (
    SELECT SUM(numberOfPlayers) 
    FROM #Temp0 T1 
    WHERE #Temp0.Sport = T1.sport 
    group BY Sport 
    ) 

SELECT * from #Temp0 
DROP Table #Temp0 
  • Bitte beachten (wie von @a_horse_with_no_name gezeigt) Diese Syntax ist korrekt für T-SQL (MS). Andere RDBMS benötigen möglicherweise einige syntaktische Optimierungen.
+0

Woher wissen Sie, dass Ozzy SQL Server verwendet? –

+0

@a_horse_with_no_name (schöner Griff). Ich habe Ihren Kommentar zu Ihrer ursprünglichen Frage bemerkt. Ich stimme zu, dass es legitim ist, das RDBMS zu befragen, wenn es nicht spezifiziert ist, da die Syntax variieren kann/wird. Allerdings hat OzzyBenitez nicht reagiert. Ich dachte, dass ich eine alternative Antwort schreiben würde, die in T-sql (MS) funktionieren würde, und auch konzeptionell korrekt ist und mit wenig Basteln auf andere RDBMS angewendet werden kann. Danke, dass du mich daran erinnerst, dass ich meine Antwort bearbeiten werde, um sie zu qualifizieren. – DaniDev

2

Sie nicht Ihre DBMS angeben, so ist dies Standard ANSI SQL ein Fenster-Funktion, dies zu tun:

select Sport, 
     NumberOfPlayers, 
     sum(NumberOfPlayers) over (partition by sport) as SumOfSport 
from the_table; 
Verwandte Themen