【问题标题】:How do I use T-SQL Group By如何使用 T-SQL 分组依据
【发布时间】:2010-09-05 09:16:28
【问题描述】:

我知道我需要(虽然我不知道为什么)在使用任何聚合函数(如 countsumavg 等)的 SQL 查询末尾有一个 GROUP BY 子句:

SELECT count(userID), userName
FROM users
GROUP BY userName

GROUP BY 还什么时候有用,对性能有什么影响?

【问题讨论】:

  • 请注意,'GROUP BY' 不会对结果集进行排序。如果您需要特定订单,请添加 ORDER BY
  • 一个更好的说法是SQL标准在使用它时不保证任何排序......但是如何在没有排序的情况下实现分组?我见过的所有实现都使用某种排序,并且几乎总是按顺序返回结果作为副作用。

标签: sql sql-server group-by


【解决方案1】:

统计标签被使用的次数可能是google的例子:

SELECT TagName, Count(*)
AS TimesUsed
FROM Tags
GROUP BY TagName ORDER TimesUsed

如果您只是想要一个不同的标签值,我更喜欢使用DISTINCT 语句。

SELECT DISTINCT TagName
FROM Tags
ORDER BY TagName ASC

【讨论】:

    【解决方案2】:

    要从具有超过 5 个小部件的每个小部件类别中检索小部件的数量,您可以这样做:

    SELECT WidgetCategory, count(*)
    FROM Widgets
    GROUP BY WidgetCategory
    HAVING count(*) > 5
    

    “have”子句是人们经常忘记的东西,而是选择将所有数据检索到客户端并在那里迭代。

    【讨论】:

      【解决方案3】:

      GROUP BY 类似于​​ DISTINCT,因为它将多条记录组合为一个。

      此示例借鉴自 http://www.devguru.com/technologies/t-sql/7080.asp,在 Products 表中列出了不同的产品。

      SELECT Product FROM Products GROUP BY Product
      
      Product
      -------------
      Desktop
      Laptop
      Mouse
      Network Card
      Hard Drive
      Software
      Book
      Accessory
      

      GROUP BY 相对于 DISTINCT 的优势在于,它可以在与 HAVING 子句一起使用时为您提供精细控制。

      SELECT Product, count(Product) as ProdCnt
      FROM Products
      GROUP BY Product
      HAVING count(Product) > 2
      
      Product      ProdCnt
      --------------------
      Desktop          10
      Laptop            5
      Mouse             3
      Network Card      9
      Software          6
      

      【讨论】:

        【解决方案4】:

        Group By 强制在返回记录之前填充整个集合(因为它是隐式排序)。

        出于这个原因(以及许多其他原因),切勿在子查询中使用 Group By。

        【讨论】:

        • 天哪,我想你是唯一回答问题的“性能”方面的人。 +1
        【解决方案5】:

        当您想要生成一个平均或汇总一组数据的报告时,GROUP BY 也很有帮助。您可以按部门 ID 和 SUM 对每个月的所有销售收入或 AVG 进行分组。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-22
          • 2015-08-22
          相关资源
          最近更新 更多