2016-05-09 23 views
0

私はジャクソンビルのウォーターフロントの維持管理をサポートする釣りトーナメントのソフトウェアを開発しています。この問題に関しては私も開始するは考えていない:私はSQL Server 2008で働いています2つのテーブルを比較し、結果を2つのレポートに出力するためのSQLクエリ

を、私は4つのテーブルがあります

Anglers, Boats, VIG_FishWeight and VIG_FishAggWeight 

Anglers: 
Angler_ANID, ANLname, ANFName, ANCity, ANState 

Boats: 
BT_ANID, BoatName 

VIG_Fishweight: 
FWAngler_ANID, FWBoatNumber, FWWeight,FWTimeStamp 

VIG_FishAggWeight: 
FAAngler_ANID, FABoatNumber,FAggWeight,FATimestamp 

VIG_FishWeightを計量すべての魚のリストが含まれています。

VIG_FishAggWeight

ANIDAngler ID各アングラー、すべてのテーブルで一貫して自動生成された数で秤量すべての魚の和を含んでいます。

トーナメントは、最大の魚と最大の総合体重トーナメントの最初の25の場所を払います。

釣り人の合計体重が彼の最大魚体重より高い位置にある場合、彼は集団トーナメントに配置されます。基本的に、各アングラーはトーナメントでランク付けされ、最大の賞金を払うことになります。

私が含まれている2つのレポート、最大の魚用と集約のための1つを作成するクエリを必要とする:

Rank, Boat Number AnglerFNAme, AnglerLName, ANCity, ANState, Weight 

私はこれで開始する任意のアイデアを持っているので、任意のいない、言ったように助けていただければ幸いです。

+0

私はこの質問はあまりにも多分あると感じていますStack Overflowの大きな範囲。 – EastOfJupiter

+1

私はSQLチュートリアルから始め、検索に「集計」と「ランク」という用語を含めます。 –

+0

あなたはあまりにも遠くなる前にオーバーホールを提案します。たとえば、クエリが集約データを処理するため、これらのテーブルのいくつかを圧縮することができます。 – Kramb

答えて

0

をちょうど私が一緒に単一selectを投げたかったので、私は、これは実際にあなたが記述しようとしていた結果を生成しないかどうかを確認するために興味が楽しみのために:ここで私が使用するクエリです。それは釣り人が2つのだけのトーナメントの1に配置することができますように聞こえる(とのみだけでなく最大の魚に一度配置することができます。)

with individual as (
    select 
     FAAngler_ANID as AnglerId, FWWeight as Weight, 
     rank() over (order by FWWeight desc) as Rnk 
    from VIG_FishWeight 
), aggregate as (
    select 
     FAAngler_ANID as AnglerId, sum(FWWeight) as Weight, 
     rank() over (order by sum(FWWeight) desc) as Rnk 
    from VIG_FishWeight 
    group by FAAngler_ANID 
), combined as (
    select 
     i.AnglerId, 
     /* Aggregate ranking must beat all the Individual rankings to win out. 
      Remember there might be multiple fish on the Individual side. */ 
     case when min(a.Rnk) < min(i.Rnk) 
      then 'Aggregate' else 'Big Fish' end as Tournament, 
     case when min(a.Rnk) < min(i.Rnk) 
      then min(a.Rnk) else min(i.Rnk) end as Rnk, 
     case when min(a.Rnk) < min(i.Rnk) 
      then max(a.Weight) else max(i.Weight) end as Weight 
    from individual as i inner join aggregate as a on a.AnglerId = i.AnglerId 
    group by i.AnglerId 
), tournament as (
    select 
     AnglerId, Tournament, Weight, 
     rank() over (partition by Tournament order by Rnk) as TournamentRank 
    from combined 
) 
select Tournament, TournamentRank, AnglerId, Weight 
from tournament /* inner join to Anglers table for name, etc. */ 
where TournamentRank <= 25 
order by Tournament, TournamentRank; 

http://rextester.com/discussion/LBF76134/Ranking-split-across-tournaments

0

解決しました。

INSERT INTO WeightsScoreTable 
    (ANFName, ANLName, BNBoatNAme, ANCity, ANState, BNBoatNumber, ANBFWeight, ANAggWeight) 
    SELECT p.FAAFName, p.FAALName, p.BAABoatName, p.FAACity, p.FAAState, p.FAABoatNumber, c.FWWeight, p.FAAAggWieght 
    FROM FAAReport AS p LEFT OUTER JOIN 
    WeightsScoreTable AS n ON n.BNBoatNumber = p.FAABoatNumber LEFT OUTER JOIN 
    FWReport AS c ON p.FAABoatNumber =c.FWABoatNumber 
    ORDER BY ANBFWeight DESC 

    DECLARE @LoopValue INT 
    SET @LoopValue = (SELECT COUNT (*) 
    FROM WeightsScoreTable) 

    WHILE @LoopValue > 0 
    BEGIN 

    INSERT INTO BigFishScore (ANFName, ANLName, BNBoatName, ANCity, ANState, ANBFWeight, BNBoatNumber) 
    SELECT ANFName, ANLName, BNBoatName, ANCity, ANState, ANBFWeight, BNBoatNumber 
    FROM WeightsScoreTable 
    WHERE (ANBFWeight = (SELECT MAX(ANBFWeight) AS Expr1 
    FROM WeightsScoreTable)) 
    ORDER BY ANBFWeight DESC 

    DELETE FROM WeightsScoreTable 
    WHERE ANBFWeight 
    IN (SELECT MAX(ANBFWeight) 
    FROM WeightsScoreTable) 

    INSERT INTO AggScore (ANFName, ANLName, BNBoatName, ANCity, ANState, ANAggWeight, BNBoatNumber) 
    SELECT ANFName, ANLName, BNBoatName, ANCity, ANState, ANAggWeight, BNBoatNumber 
    FWHERE (ANBFWeight = (SELECT MAX(ANAggWeight) AS Expr2 
    FROM WeightsScoreTable)) 
    ORDER BY ANAggWeight DESC 

    DELETE FROM WeightsScoreTable 
    WHERE ANAggWeight 
    IN (SELECT MAX(ANAggWeight) 
    FROM WeightsScoreTable) 

    SET @LoopValue = (@LoopValue - 1) 
END 
+0

"Big Fish"を "Aggregate"の前に処理するので、これはランキングでのネクタイの場合、アングラーを間違ったトーナメントに入れますか?あなたの記述は、この場合、「集約」が勝者になるはずであることを暗示していたようです。また、これはどれくらいの可能性があるのか​​わからないが、ランキングの関係を全く処理しない。 – shawnt00

+0

良い点。 VIG_FishWeightテーブルには、ネクタイを解決するために使用できるタイムスタンプフィールドがあります。 (最初の魚が重くなった。) –

関連する問題