2016-05-09 99 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表中有一个可用于解决关系的时间戳字段。 (第一条鱼称重赢。) –