【问题标题】:SQL Server: How can I use the COUNT clause without GROUPing?SQL Server:如何在不使用 GROUP 的情况下使用 COUNT 子句?
【发布时间】:2012-05-13 17:35:06
【问题描述】:

我希望从查询中得到两件事,给定一组约束:

  • 第一场比赛
  • 匹配总数

我可以通过以下方式获得第一场比赛:

SELECT TOP 1
    ID,
    ReportYear,
    Name,
    SignDate,
     ... 
FROM Table
WHERE
     ...
ORDER BY ... //I can put in here which one I want to take

然后我可以得到匹配计数,如果我使用

SELECT
    MIN(ID),
    MIN(ReportYear),
    MIN(Name),
    MIN(SignDate),
     ... ,
    COUNT(*) as MatchCount
FROM Table
WHERE
     ...
GROUP BY
     ??? // I don't really want any grouping

我真的想避免对所有结果进行分组和使用聚合函数。这个问题SQL Server Select COUNT without using aggregate function or group by 表明答案是

SELECT TOP 1
    ID,
    ReportYear,
    Name,
    SignDate,
     ... ,
    @@ROWCOUNT as MatchCount
FROM Table

这在没有 TOP 1 的情况下有效,但是当它在那里时,@@ROWCOUNT = 返回的行数,即 1。我怎样才能基本上得到 COUNT(*) 的输出(where 子句之后剩下的任何内容)任何分组或需要聚合所有列?

我不想重复这些操作两次,第一行一次,@@ROWCOUNT 再一次。我没有找到可以正确使用 GROUP BY 的方法,因为我严格想要符合我的标准的项目数量,并且我想要列如果我对它们进行 GROUP 会丢弃这个数字 - 除非我误解了 GROUP BY。

【问题讨论】:

    标签: sql count group-by


    【解决方案1】:

    假设您使用的是新版本的 SQL Server(内存中的 2008+),那么您可以使用分析函数。

    稍微简化一下,它们是一种对一组数据而不是一组数据进行聚合的方式 - 对基本聚合的扩展。

    而不是这个:

    SELECT
         ... , 
        COUNT(*) as MatchCount
    FROM Table
    WHERE
         ...
    

    你这样做:

    SELECT
         ... ,
        COUNT(*) as MatchCount OVER (PARTITION BY <group fields> ORDER BY <order fields> )
    FROM Table
    WHERE
         ...
    GROUP BY
    

    如果没有实际运行一些代码,我无法准确回忆起您不能以这种方式使用哪些聚合。不过计数没问题。

    【讨论】:

    • 那么我可以在没有 PARTITIONing 或 ORDERing 的情况下使用它吗?或者以某种方式在 PARTITION BY 中放置一些不会改变结果(实际上没有分组)的东西?
    • 分区的重点是对数据进行分组。但是将其与单个记录组合在一起。随着分组(分区)和/或排序你只是有一个标准的聚合无论如何。有关 MS 文档,请查看此处:msdn.microsoft.com/en-us/library/ms189461.aspx 对于您的第一个示例,您可以获得组中的第一条记录,您可以对其进行适当排序,然后返回第一条记录。 (即与使用“order by”进行“top 1”相同)。你不能做的是使用 GROUP 子句(如果你也想这样做,你需要使用子查询)。
    • 当与@Tom 的回答为空 OVER - COUNT(*) as MatchCount OVER () FROM ...
    • 这个 COUNT 和 PARTITION 组合也适用于我在 sql server 2005 上的需要 - 我将它用于 COUNT 和 SUM。
    【解决方案2】:

    嗯,你可以使用OVER子句,它是一个窗口函数。

    SELECT  TOP (1)
        OrderID, CustID, EmpID,
        COUNT(*) OVER() AS MatchCount
    FROM    Sales.Orders
    WHERE   OrderID % 2 = 1
    ORDER BY OrderID DESC 
    

    【讨论】:

      【解决方案3】:

      尝试下一个查询:

      select top 1
          *, count(*) over () rowsCount
      from
          (
              select
                  *, dense_rank() over (order by ValueForOrder) n
              from
                  myTable
          ) t
      where
          n = 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-12
        • 2018-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-21
        • 1970-01-01
        相关资源
        最近更新 更多