2017-06-29 23 views
-1

sqlのグループの合計を取得するのに助けが必要です。これは私が持っているテーブルです。グループのSQL合計

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

これは、私はそれが見えるようにしたいものです。

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

提示してください:どのくらいあなたが得ていますか?何を試しましたか? – DaniDev

+0

可能であれば、使用しているRDBMSに質問にタグを付けることができますか?それらの間には構文上の違いがあります。 – Turophile

+0

あなたのお問い合わせはどこですか? – Eric

答えて

0

は(各スポーツのためのプレーヤーの総数を保持するテーブルを作成し、sumPlayerそれを呼び出しますまたはあなたが好きなもの)。次に、sumPlayerを使用してテーブルを結合します。

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 

、結果は次のようになります。

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

あなたがGROUP BY statementをチェックアウトする必要があり、この情報がお役に立てば幸いです。非常に一般的な意味で、(COUNT、MAX、MIN、SUM、AVG)などの集計関数を使用する場合は、GROUP BYを最初に実行する必要があります。

1

スポーツによってグループ化されたスポーツテーブルの各行のプレーヤの集計を実行するにはCROSS APPLY文を使用し、WHERE句を使用してCROSS APPLYの結果をフィルタリングし、スポーツの場合は最初のクエリの集計のみを返します。 OUTER APPLYの最初のクエリと同じです。これを行うには

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

OzzyがSQL Serverを使用していることをどのように知っていますか? –

+0

Ozzyがウィンドウ関数をサポートしていないSQL Server 2005または2008を使用していないことをどのように知っていますか? (ランクウィンドウ関数を除く)。彼は指定しなかったので、私は彼にSQL Serverで動作する答えを与えました。 – wrslphil

+0

'sql'のタグ情報から引用します:" * SQLでタグ付けされた質問への回答は、ISO/IEC標準SQL *を使用すべきです "。ウィンドウ関数は、ほぼ15年の間、SQL標準の一部となっています。標準のSQLを使った答えは、[現代のDBMS](http://modern-sql.com/) –

0

もう一つの方法は、あなたが望む一時的な構造を作成し、合計で更新する別のクエリを使用するために一時テーブル番号のTEMP0を使用することです:

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 
  • 注意してください(@a_horse_with_no_nameで指摘されているように)この構文はT-SQL(MS)に適しています。他のRDBMSは構文的に調整が必要な場合があります。
+0

OzzyがSQL Serverを使用していることをどのように知っていますか? –

+0

@a_horse_with_no_name(素敵なハンドル)。あなたのオリジナルの質問にあなたのコメントを見ました。構文が変わる可能性があるため、RDBMSを指定しないと疑問に思うのは正当だと私は同意します。しかし、OzzyBenitezは反応しなかったので。私は、T-SQL(MS)で動作する代替の回答を投稿し、概念的には正しいと思っており、ちょっとしたやりかたで他のRDBMSにも適用できます。私にそれを修飾するために私の答えを編集することを思い出してくれてありがとう。 – DaniDev

2

あなたのDBMSを指定していないので、これはこれを行うために窓関数を使用して、標準のANSI SQLです:

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