2017-03-04 6 views
1

私は現在、リーマンアクセス野球データベースを取得し、それをMSSQLに変換し、それに対する機能を構築する個人プロジェクトに取り組んでいます。私はデータベースを変換することができたし、バッティング、ピッチング、フィールディングの3つの統計ビューを構築しました。条項を使用して列値または連結テキストを表示し、ANDから除外するGROUP BY

私は現在、バッティングタイトルの資格を持つ選手のリストを返すためにバッティングビューに対してクエリを行っています。これは私が得ているどのくらいです:私が検証マスター(MLB.com)に対する私の結果を確認するためにORDER BY句を使用しています

SELECT Player, Season, SUM(AB) AS AB, SUM(BB)AS BB, SUM(HBP) AS HBP, 
SUM(SH)AS SH, SUM(SF) AS SF, AVG(AVG)AS AVG, AVG(OBP) AS OBP, 
AVG(SLG) AS SLG, AVG(OPS) AS OPS 
FROM View_PlayerBatting 
WHERE Season = '2016' 
GROUP BY Player, Season 
HAVING (SUM(AB) + SUM(BB) + SUM(HBP) + SUM(SH) + SUM(SF)) > 502 
ORDER BY AVG(OPS) DESC 

私が持っている問題は、このリストにチームを含めたいと思っていて、選手の中にはシーズン中半期に取引されていたので、チーム別にグループ化したくない7件のその他の認定結果)。私は、SELECT句に何か追加しようとする場合は、:私のselect句に

​​

を、それがGROUP BYでチームを含めるために私を強制します。私のような、別のテーブルから値を返すサブクエリを使用しようとした場合、それはまた、GROUP BYでチームを含めるために私を強制的に:

IIF(COUNT(Team) = 1, (SELECT teamID FROM Teams where TeamID = View_PlayerBatting.Team), ...

それは私がチームの価値を知っているが必要場合のように思えます、私はそれをGROUP BY句に含める必要があります。静的な値や文字列のようにTeamカラム以外の何かを返すようにIIFの最初の結果を変更した場合、チームはGROUP BYにいなくても実行されます。どのように私はそれを提示しようとしている形式でチームの列を返すのですか?

+0

おそらく、データを簡略化してサンプルデータと望ましい結果を表示することができます。 –

答えて

1

私はそのデータベースに精通していませんが、基本的にグループにつき、トップ1を解決しようとしています。あなたはmax(Team)を使うことができますが、それはあなたが望むチームを得ることができないかもしれません。あなたは、連結各プレイヤーのためのすべてのteamの値を取得したい場合は、あなたが使用することができ

SELECT Player, Season, x.Team 
, SUM(AB) AS AB, SUM(BB)AS BB, SUM(HBP) AS HBP, 
SUM(SH)AS SH, SUM(SF) AS SF, AVG(AVG)AS AVG, AVG(OBP) AS OBP, 
AVG(SLG) AS SLG, AVG(OPS) AS OPS 
FROM View_PlayerBatting 
cross apply (
    select top 1 
    Team 
    from View_PlayerBatting as i 
    where i.Player = View_PlayerBatting.Player 
    and i.Season = View_PlayerBatting.Season 
    order by TradeDate desc 
) as x 
WHERE Season = '2016' 
GROUP BY Player, Season, x.Team 
HAVING (SUM(AB) + SUM(BB) + SUM(HBP) + SUM(SH) + SUM(SF)) > 502 
ORDER BY AVG(OPS) DESC 

あなたはそうのようなTradeDateのようないくつかの列が注文したプレイヤーとシーズンごとに1つのチームを取得するためにcross apply()を使用することができますstuff() with select ... for xml path ('') method of string concatenation

SELECT Player, Season, 
, Team = stuff((
     select distinct '; '+i.Team 
     from View_PlayerBatting as i 
     where i.Player = View_PlayerBatting.Player 
     and i.Season = View_PlayerBatting.Season 
     for xml path (''), type).value('.','varchar(max)') 
    ,1,2,'') 
    , SUM(AB) AS AB, SUM(BB)AS BB, SUM(HBP) AS HBP 
    , SUM(SH)AS SH, SUM(SF) AS SF, AVG(AVG)AS AVG, AVG(OBP) AS OBP 
    , AVG(SLG) AS SLG, AVG(OPS) AS OPS 
FROM View_PlayerBatting 
WHERE Season = '2016' 
GROUP BY Player, Season, x.Team 
HAVING (SUM(AB) + SUM(BB) + SUM(HBP) + SUM(SH) + SUM(SF)) > 502 
ORDER BY AVG(OPS) DESC; 
+1

実際、MAXを使用して問題を解決すると、私はそれについて考えませんでした。 ASチームはチームが1つの場合はチームを返し、それ以上のチームがある場合は「Xチーム」を返します(「チーム」は1チーム、MAXはチーム、ASチームはチームとなります) 1つ以上。 –

+1

@K_Cruz素晴らしい!あなたが満足できる解決策を見つけてうれしいです。私は別の選択肢として連結された 'チーム 'を含むように私の答えを更新しました。 – SqlZim

関連する問題