2016-05-09 43 views
0

我正在開發支持在傑克遜維爾維護海濱的釣魚錦標賽軟件,我正在學習SQL。對於這個問題,我不知道在哪裏甚至開始:用於將兩個表格和輸出結果以正確順序比較兩個報表的SQL查詢

我在SQL Server 2008中工作,我有四個表:

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個名額。

如果釣魚者的總重量高於他最大的魚重,那麼他將被放入總比賽。基本上每個釣魚者都會在爲他支付最大獎金的錦標賽中排名。

我需要一個查詢來創建兩個報告,一個是最大的魚,一個用於聚合包含:

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

正如我所說,我沒有任何頭緒這一點,所以任何幫助將不勝感激。

+0

我有一種感覺,這個問題可能是太堆棧溢出的範圍很大。 – EastOfJupiter

+1

我會從SQL教程開始,在搜索中包含術語「聚合」和「排名」。 –

+0

我會建議在太遠之前進行檢修。例如,您可以壓縮這些表中的一部分,因爲您的查詢將處理聚合數據。 – Kramb

回答

0

只是爲了好玩,我想拼湊一個select,所以我很好奇,看看如果這樣做實際產生你試圖描述的結果。這聽起來像一個釣魚者可以在兩場比賽中的一個唯一的地方(而只能在最大的魚進行一次爲好。)

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

既然你在「Aggregate」之前處理「Big Fish」,這將會在排名情況下讓釣魚者參加錯誤的錦標賽嗎?你的描述似乎暗示在這種情況下「總計」應該是贏家。此外,這不會處理排名中的聯繫,儘管我不知道這有多可能。 – shawnt00

+0

好點。 VIG_FishWeight表中有一個可用於解決關係的時間戳字段。 (第一條魚稱重贏。) –