【问题标题】:sql select statement with a group by带有 group by 的 sql select 语句
【发布时间】:2011-01-28 06:06:11
【问题描述】:

我有 2 个表格中的数据,我想创建一个报告。

表 A:

  • tableAID(主键)
  • 姓名

表 B:

  • tableBID(主键)
  • 等级
  • tableAID(外键,引用表 A)

这两个表还有更多内容,但这些是相关的列。

从概念上讲,我要运行的查询是:

select TableA.name, avg(TableB.grade) where TableB.tableAID = TableA.tableAID

问题当然是我使用的是聚合函数(avg),我可以这样重写:

select avg(grade), tableAID from TableB group by tableAID

但是我只获得了 TableA 的 ID,而我确实需要出现在 TableA 中的名称列,而不仅仅是 ID。

是否可以在一个语句中编写一个查询来执行此操作,或者我是否首先需要执行我列出的第二个查询,获取 id 列表,然后查询 TableA 中的每条记录以获取名称列...似乎对我来说,我在这里遗漏了一些明显的东西,但我(很明显)不是 sql 大师......

【问题讨论】:

    标签: sql select group-by


    【解决方案1】:

    你可以这样做:

    SELECT avg(b.grade), a.tableAID, a.name 
    FROM TableA a 
         JOIN TableB b
           ON b.tableAID = a.tableAID
    GROUP BY a.tableAID, a.name
    

    在您的情况下,只需将其添加到组中即可。

    【讨论】:

    • +1 响应速度 - 是在发布后 15 秒还是 20 秒!
    • 是的,不知何故,他正在预先计算答案。或者可能只是一个非常好的缓存算法。
    • @amelvin, @Larry - 我承认,我是个机器人 :(
    • "...在您的情况下可以正常工作。"我可以假设我可以将更多列添加到我可能需要的 TableA 的“分组依据”中,而不会出现任何性能问题吗?
    • @user85116 - 这是正确的,优化器会很好地处理这个问题,只需添加您需要的任何列。如果万一您确实遇到了某种性能下降,请在查询/表设置中发布另一个问题,您将获得特定的优化/索引提示......社区中有很多 SQL 优化专家。
    【解决方案2】:
     SELECT AVG(TableB.grade), TableB.tableAID, TableA.Name 
          FROM TableA INNER JOIN TableB
          ON TableA.TableAID = TableB.TableAID
          GROUP BY TableA.tableAID, TableA.Name
    

    【讨论】:

      【解决方案3】:

      另一种答案:

      SELECT AVG(b.grade), a.tableAID, MAX(a.name )
      FROM TableA a 
           JOIN TableB b
             ON b.tableAID = a.tableAID
      GROUP BY a.tableAID
      

      只是为了让你思考。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-25
        • 1970-01-01
        • 2011-08-31
        • 1970-01-01
        • 2013-12-09
        相关资源
        最近更新 更多