2011-12-08 2 views
1

Ceci n'est pas un doublon de SQL Server Query LEFT JOIN, SUM and GROUP BY and I'm stumped!. S'il vous plaît ne pas marquer en double simplement à cause des similitudes dans les titres.Sql avec jointure à gauche, somme cumulée et groupe

Supposons que j'ai une table STARTING_QUARTERBACK avec des colonnes player_id (int), EQUIPE (int). J'ai aussi une autre table QUART avec des colonnes player_id (int), LAST_NAME (varchar 20), FIRST_NAME (varchar 20), et une table appelée STATISTIQUES avec des colonnes player_id (int), GAME_DATE (DateTime), TOUCHDOWN (entier), PASSING_YARD (entier).

STARTING_QUARTERBACK 
    PLAYER_ID  int 
    TEAM   int 

QUARTERBACK 
    PLAYER_ID  int 
    LAST_NAME  varchar 20 
    FIRST_NAME  varchar 20 

STATISTICS 
    PLAYER_ID  int 
    GAME_DATE  DateTime 
    TOUCHDOWN  int 
    PASSING_YARDS int 

Je voudrais écrire une requête pour sélectionner tous les quarts-arrières qui ne sont pas un départ, mais ont jeté plus d'un combiné de plus de 10 passes de touché ou plus de 1000 verges de tous les jeux en 2009.

Le résultat devrait énumérer 1 rangée par quart-arrière qui remplit les conditions et ses TDs agrégés et yards de dépassement en 2009.

Je reçois plusieurs rangées par quarterback où chaque rangée montre la statistique individuelle de chaque jeu en 2009 qui n'est pas vraiment vouloir. Je veux l'agrégat. Quel serait le bon SQL? Ayant inclus mon code est destiné à clarifier de ne pas confondre, mais il semble avoir l'effet inverse, donc je viens de supprimer le code. La question peut être résumée comme suit: Faire semblant que la NFL vous donne les 3 tables ci-dessus et vous demande de lister tous les QB non-départ qui ont bien fait en 2009 et montrer leurs TD combinés et yards de dépassement pour cette année. La NFL ne se soucie pas des jeux individuels, juste le total. La définition de «bien faire» est de plus de 10 TD ou de 1000 verges.

+0

Je pense que vous voulez 'GROUP par ordre QUARTERBACK.PLAYER_ID par QUARTERBACK.PLAYER_ID' plutôt que par ordre. – Dan

+0

@Dan: GROUP par QUARTERBACK.PLAYER_ID est là. Vous pouvez juste ignorer cet ordre par, ce ne sera pas important pour ce que je suis en train de demander. –

+1

Ce code est si verbeux, je n'ai aucune envie de le lire. Veuillez utiliser des alias courts au lieu des noms de table complets. –

Répondre

1

Il est difficile de dire sans regarder les données. Je pense que le problème pourrait être le groupe par. Essayez ces deux modifications:

  • Supprimez le STARTING_QUARTERBACK.TEAM du groupe par. Vous ne recherchez pas de personnes dans STARTING_QUARTERBACK. Supprimez-le également du SELECT. Il sera toujours NULL

  • Retirez la condition "STATISTICS.GAME_DATE> = '2009-01-01' et STATISTICS.GAME_DATE < '2010-01-01'" de having vous filtrez déjà dans le WHERE.

1
select 
player_id, sum(touchdown) total_touchdowns, sum(passing_yard) total_yardage 
from quaterback q, statistics s 
where q.player_id = s.player_id 
and q.player_id not in (select player_id from starting_quarterback) 
group by player_id 
having sum(touchdown) > 10, sum(passing_yard) > 1000 

ou

select * from 
(
    select 
    player_id, sum(touchdown) total_touchdowns, sum(passing_yard) total_yardage 
    from quaterback q, statistics s 
    where q.player_id = s.player_id 
    and q.player_id not in (select player_id from starting_quarterback) 
    group by player_id 
) 
where total_touchdows > 10 and total_yardage > 1000 
+0

Merci. Je n'ai pas beaucoup posté et je ne savais pas comment bloquer le format ... et je n'avais pas envie de jouer avec ça trop longtemps;) – Dano