SQL查询将两个表和输出结果比较为正确顺序的两个报表

时间:2016-05-09 14:41:33

标签: sql-server sql-server-2008-r2

我正在为钓鱼锦标赛开发软件,支持在杰克逊维尔维护海滨,我正在学习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

正如我所说,我不知道从哪里开始,所以任何帮助都会非常感激。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

相关问题