SQL Server聚合函数查询错误

时间:2013-05-27 10:54:29

标签: sql sql-server aggregate-functions

我的查询

SELECT TOP 1 *, COUNT(*) AS totalRun 
FROM history 
ORDER BY starttime DESC`

估算结果是历史记录表中包含最新starttime的1行的所有数据和包含记录总数的字段totalrun,但是......我收到以下错误。< / p>

  

Msg 8120,Level 16,State 1,Line 1
  列'history.id'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

我做错了什么?

修改
结果的例子: expected result 这些是历史记录表中具有最新启动时间的行的所有字段,其中包含额外的COUNT字段'totalRun'

4 个答案:

答案 0 :(得分:5)

聚合只能用两种情况表示。

  1. 您有GROUP BY声明的地方
  2. 您使用OVER子句
  3. 的位置

    以下内容将为您提供最近的开始时间以及源表中共享该开始时间的行数...

    SELECT
      starttime,
      COUNT(*)  AS row_count
    FROM
      history
    GROUP BY
      starttime
    ORDER BY
      starttime DESC
    

    在此结构中,您可以选择的字段是GROUP BY语句中的字段(您可以有几个),或聚合*(例如如SUM()COUNT()等)。

    但是,如果您希望在整个表上完成COUNT(*),而不是仅将组合在一起的行,则可以使用OVER语句中的SELECT子句。

    SELECT
      *,
      COUNT(*) OVER (PARTITION BY 1) AS row_count
    FROM
      history
    ORDER BY
      starttime DESC
    

    因为这不使用GROUP BY,您还可以选择*而不只是选择要分组的字段。

    如果您需要不同的内容,请列出一些示例数据和您想要的结果吗?

答案 1 :(得分:3)

您可以按列聚合或分组。您的列不是

SELECT TOP 1
   starttime, COUNT(*) AS totalRun
FROM history
GROUP BY starttime, foo
ORDER BY starttime DESC;

如果您需要列foo,请按以下步骤添加

SELECT TOP 1
   starttime, foo, COUNT(*) AS totalRun
FROM history
GROUP BY starttime, foo
ORDER BY starttime DESC, foo;

答案 2 :(得分:0)

我无法正确理解要求。你为什么使用排名前1的计数(*) 没有group by子句。

如果您想要在上次日期获得的结果TotalRuns,那么您可以使用此查询

SELECT TOP 1  starttime, COUNT(1) AS totalRun 
            FROM history Group by starttime ORDER BY starttime DESC

答案 3 :(得分:0)

如果这是要求:

估计结果是历史记录表中包含最新开始时间的1行中的所有数据以及包含记录总数的fieldtotalrun,

选择前1 * 从 (选择 * 从历史 其中starttime =(从历史中选择max(starttime)))i 全外连接 (选择count(1)count,max(starttime)sttime as fieldtotalrun 来自历史)j on i.starttime = j.sttime