具有左连接的Sql,汇总Sum和Group By

时间:2011-12-08 21:30:30

标签: sql

这不是SQL Server Query LEFT JOIN, SUM and GROUP BY and I'm stumped!的副本。请不要因为标题中的相似性而标记重复。

假设我有一个表 STARTING_QUARTERBACK ,其列 PLAYER_ID (int), TEAM (int)。我还有另一个表格 QUARTERBACK ,列 PLAYER_ID (int), LAST_NAME (varchar 20), FIRST_NAME (varchar 20),以及名为ç计的表格,列 PLAYER_ID (int), GAME_DATE (日期时间), TOUCHDOWN ( int), PASSING_YARD (int)。

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

我想写一个查询来选择所有四分卫,这些四分卫不是首发,但在2009年的所有比赛中总共超过10次达阵或超过1000码。

结果应该列出满足条件的每个四分卫1排,以及他在2009年汇总的TD和传球码数。

我每四分卫得到多行,每一行显示2009年每场比赛的个人统计数据,这不是我真正想要的。我想要聚合。什么是正确的SQL?

编辑包含我的代码是为了澄清不要混淆,但它似乎有相反的效果,所以我只是删除了代码。问题可归纳如下:假装NFL向你提供上述3个表格,并要求你列出所有在2009年表现不错的非首发QB,并显示他们在那一年的合并TD和传球码数。 NFL并不关心个人比赛,只关心比赛。 “做得好”的定义超过10个TD或1000码。

2 个答案:

答案 0 :(得分:1)

如果不查看数据,很难说。 我认为这个问题可能是小组的问题。试试这两个变化:

  • 从组中删除STARTING_QUARTERBACK.TEAM。你不是在寻找STARTING_QUARTERBACK中的人。也从SELECT中删除它。它将始终为NULL

  • 从已经在WHERE中过滤的情况中删除条件“STATISTICS.GAME_DATE> ='2009-01-01'和STATISTICS.GAME_DATE<'2010-01-01'”。

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

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