【问题标题】:Sql with Left Join, aggregate Sum and Group By具有左连接、聚合 Sum 和 Group By 的 Sql
【发布时间】:2011-12-09 16:40:15
【问题描述】:

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

假设我有一个表 STARTING_QUARTERBACK,其中包含 PLAYER_ID (int)、TEAM (int) 列。我还有另一个表 QUARTERBACKPLAYER_ID (int), LAST_NAME (varchar 20), FIRST_NAME (varchar 20),以及一个名为 STATISTICS 的表格,其中包含 PLAYER_ID (int)、GAME_DATE (DateTime)、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 码。

【问题讨论】:

  • 我想你想GROUP by QUARTERBACK.PLAYER_ID order by QUARTERBACK.PLAYER_ID 而不仅仅是订购。
  • @Dan:按 QUARTERBACK.PLAYER_ID 分组。您可以忽略该顺序,这与我要询问的内容无关。
  • 这段代码太冗长了,我没有阅读的兴趣。请使用短别名而不是完整的表名。
  • 啊抱歉,没看到。您确定该 group by 作品自 starting_quarterback.team 不应该存在吗?你不能只按玩家ID分组吗?另外,您的sum(STATISTICS.PASSING_YARD < 1000) 的括号不好,我不确定您为什么在拥有而不是加入时过滤游戏日期。
  • @Khnle - 请不要删除 SQL。令人困惑的是您的 SQL 语句的文本样式墙,而不是您拥有它的事实。如果没有 SQL,您将错过人们需要查看以帮助您的重要细节,与没有它相比,您将获得更好和更多的答案。没有它,您的问题可能会因无法回答而被关闭。我已将其回滚,您需要重新输入您编辑过的任何其他文本。

标签: sql


【解决方案1】:

不看数据很难说。 我认为问题可能是group by。尝试以下两种更改:

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

  • 从 HAVING 中删除条件“STATISTICS.GAME_DATE >= '2009-01-01' and STATISTICS.GAME_DATE

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

    • 谢谢。没有发布太多,也不知道如何阻止格式......并且不想把它弄太久;)
    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2014-12-27
    相关资源
    最近更新 更多