2016-05-09 10 views
0

Ich entwickle Software für ein Angelturnier, das das Beibehalten der Ufergegend hier in Jacksonville unterstützt, und ich lerne SQL, wie ich gehe. Für dieses Problem habe ich keine Ahnung, wo beginnen sogar:SQL-Abfrage, um zwei Tabellen und Ausgabeergebnisse zu zwei Berichten in der richtigen Reihenfolge zu vergleichen

ich in SQL Server 2008 arbeite und ich habe vier Tabellen:

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 enthält eine Liste aller gewogenen Fisch.

VIG_FishAggWeight enthält die Summe aller von jedem Angler gewogenen Fisches

ANID ist Angler ID, eine Auto-generierte Nummer, die in allen Tabellen konsistent ist.

Das Turnier zahlt die ersten 25 Plätze in den größten Fischen und den größten Gesamtgewicht Turnieren.

Wenn das Gesamtgewicht eines Anglers höher liegt als sein größtes Fischgewicht, wird er in das Gesamtturnier aufgenommen. Grundsätzlich wird jeder Angler in dem Turnier platziert, das ihm den größten Preis zahlt.

ich brauche eine Abfrage zwei Berichte zu erstellen, einen für größten Fisch und einen für Aggregat, das enthält:

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

Wie gesagt, ich habe keine Ahnung, wo damit beginnen, so dass jeder Hilfe würde sehr geschätzt werden.

+0

ich das Gefühl, dass diese Frage wahrscheinlich auch ist großer Spielraum für Stack Overflow. – EastOfJupiter

+1

Ich würde mit SQL-Tutorials beginnen und die Begriffe "Aggregat" und "Rang" in Ihre Suche aufnehmen. –

+0

Ich würde eine Überholung vorschlagen, bevor Sie zu weit kommen. Sie können beispielsweise einige dieser Tabellen komprimieren, da Ihre Abfragen die aggregierten Daten verarbeiten. – Kramb

Antwort

0

Just for fun ich zusammen ein einziges select werfen wollte und so bin ich gespannt, ob dies tatsächlich das Ergebnis produziert, das Sie versuchen, zu beschreiben. Es klingt wie ein Angler nur in einer der beiden Turnieren platzieren können (und kann nur einmal als auch in den größten Fisch platzieren.)

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

Gelöst es. Hier ist die Abfrage, die ich verwenden:

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

Da du "Big Fish" vor "Aggregate" verarbeitest, wird dies den Angler im Falle eines Unentschiedens in ein falsches Turnier bringen? Ihre Beschreibung schien zu implizieren, dass "Aggregat" in diesem Fall der Gewinner sein sollte. Auch das wird in den Rankings überhaupt nicht mithalten, obwohl ich nicht weiß, wie wahrscheinlich das ist. – shawnt00

+0

Guter Punkt. In der Tabelle VIG_FishWeight gibt es ein Zeitstempelfeld, mit dem ich Bindungen lösen kann. (Der erste Fisch wog Gewinne.) –

Verwandte Themen