4

SQL Server 2008 でスコアのリストから要約を生成しようとして
います。2 つのテーブルがあります: SQL Fiddle リンク

テーブルには、ScorePerson人の ID と -5 から 15 までのスコアが含まれています。SQL/ストアド プロシージャのエンド ユーザーは、次のような要約を作成する必要があります。

Scoreband| TotalNoOfPeople | AvgScore
--------------------------------
-5 to 0  | 2               | -2
0 to 5   | 3               |  2
5 to 10  | 2               |  8
10 to 15 | 3               | 13.3

スコア バンド、つまり最小値と最大値はScoreMinMax、エンド ユーザーがテーブルから構成できる必要があります。

CASE ステムを使用してこれを実現しようとしましたが、サマリーが列として生成されます。II はおそらくそれをピボットするか、複数の選択ステートメントから UNION を使用する必要があります。ScoreMinMaxただし、テーブルに新しい行が追加された場合、このアプローチはスケーラブルではないようです。これまでのところ、CROSS JOINT を使用して上記の例と同様の結果を得ることができましたが、常に正しい結果が得られるとは限りません。

これを達成する方法について誰かが私を正しい方向に向けることができますか?

SQL フィドル リンク

ScorePerson - contains actual scores

テーブルのスクリーンショット

ScoreMinMax - the configuration for min and max score bands

ここに画像の説明を入力

4

3 に答える 3

4

集計関数を使用できます。

select title ScoreBand,
  count(*) TotalNoPeople, 
  avg(p.score) AvgScore  
from scoreperson p
inner join scoreminmax m
  on p.score between m.minscore and m.maxscore
group by Title
order by cast(left(title, 2) as int) 

SQL Fiddle with Demoを参照してください

既存の範囲に人がいない場合は、次のようにすることができます。

select case when title is not null 
            then title
            else 'No Range' end ScoreBand,
  count(personid) TotalNoPeople, 
  avg(p.score) AvgScore  
from scoreperson p
left join scoreminmax m
  on p.score between m.minscore and m.maxscore
group by id, Title
order by id

SQL Fiddle with Demoを参照してください

使用できるコメントに基づいて、#2を編集します。

select m.title ScoreBand,
  count(p.personid) TotalNoPeople, 
  avg(p.score) AvgScore  
from scoreminmax m
left join scoreperson p
  on p.score between m.minscore and m.maxscore
group by m.id, m.Title
order by m.id;

SQL Fiddle with Demoを参照してください

于 2012-09-26T12:33:12.550 に答える
1

試す

Select Title, count(personid), AVG(score)
from 
    scoreminmax  
    left join scoreperson 
    on scoreperson.score>=minscore 
    and scoreperson.score<maxscore 
group by ID,title 
order by ID 

グループの 1 つだけに境界 (0,5,10) のスコアを含めたことに注意してください。

于 2012-09-26T12:32:42.090 に答える
0
select smm.Title Scoreband, count(*) TotalNoOfPeople, avg(sp.Score) AvgScore
from 
    ScorePerson sp
    inner join
    ScoreMinMax smm on sp.Score >= smm.MinScore and sp.Score < smm.MaxScore
group by smm.Title
于 2012-09-26T12:36:01.327 に答える