【问题标题】:Adding count(*) to SQL Server query将 count(*) 添加到 SQL Server 查询
【发布时间】:2014-12-31 17:38:36
【问题描述】:

我正在尝试找到一种方法来为我的查询输出添加计数:

SELECT *
FROM 
    (SELECT 
        id, 
        'Event Location' AS name, 
        venueName AS snippet, 
        venueLatLng AS coordinates, 
        (3959 
        * acos(cos(radians('xx.xxxxxx')) 
        * cos(radians(SUBSTRING(venueLatLng, 1, CHARINDEX(',', venueLatLng)-1))) 
        * cos(radians(SUBSTRING(venueLatLng, CHARINDEX(',', venueLatLng) + 1, 1000)) 
        - radians('-xx.xxxxxxx')) 
        + sin(radians('xx.xxxxxx')) 
        * sin(radians(SUBSTRING(venueLatLng, 1, CHARINDEX(',', venueLatLng)-1))))) AS distance 
     FROM marker) TMP 
WHERE 
    distance < 30 
ORDER BY 
    distance;

我尝试这样做的方式是:

SELECT *
FROM (
SELECT  id, 
        'Event Location' AS name, 
        venueName AS snippet, 
        venueLatLng AS coordinates, 
        COUNT(*) AS rCount, 
        (3959 
        * acos(cos(radians('xx.xxxxxx')) 
        * cos(radians(SUBSTRING(venueLatLng, 1, CHARINDEX(',', venueLatLng)-1))) 
        * cos(radians(SUBSTRING(venueLatLng, CHARINDEX(',', venueLatLng) + 1, 1000)) 
        - radians('-xx.xxxxxxx')) 
        + sin(radians('xx.xxxxxx')) 
        * sin(radians(SUBSTRING(venueLatLng, 1, CHARINDEX(',', venueLatLng)-1))))) AS distance 
FROM marker) TMP 
WHERE distance < 30 
ORDER BY distance;

错误是这样的:

选择列表中的“marker.id”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

我怎样才能正确地做到这一点?

【问题讨论】:

  • (1) 您的两个查询似乎相同; (2) 假设列实际存在,两者都不会在marker.id 上产生错误。
  • id 确实存在,因为如果我取出 COUNT(*) AS rCount 部分,查询就可以工作。

标签: sql sql-server database record-count


【解决方案1】:

你不能在没有 GROUP BY 或 OVER (PARTITION BY ...) 的情况下使用 COUNT(*)

尝试将您的查询更改为

COUNT(*) OVER () AS rCount,

COUNT(*) OVER (PARTITION BY ColumnName) AS rCount,

【讨论】:

    【解决方案2】:

    使用COUNT 的解析版本,并确保将其放在您的外部 查询中,这样它就会尊重WHERE distance &lt; 30

    SELECT
      TMP.*,
      COUNT(*) OVER () AS RCount
    FROM (
      SELECT  id, 
        'Event Location' AS name, 
        venueName AS snippet, 
        venueLatLng AS coordinates, 
        (3959 
        * acos(cos(radians('xx.xxxxxx')) 
        * cos(radians(SUBSTRING(venueLatLng, 1, CHARINDEX(',', venueLatLng)-1))) 
        * cos(radians(SUBSTRING(venueLatLng, CHARINDEX(',', venueLatLng) + 1, 1000)) 
        - radians('-xx.xxxxxxx')) 
        + sin(radians('xx.xxxxxx')) 
        * sin(radians(SUBSTRING(venueLatLng, 1, CHARINDEX(',', venueLatLng)-1))))) AS distance 
      FROM marker) TMP 
    WHERE distance < 30 
    ORDER BY distance;
    

    【讨论】:

    • 干得好,埃德!谢谢!
    【解决方案3】:

    如果您需要统计同一行出现的次数,只需添加一个 group by 子句,其中包含您需要选择的所有字段,因此:

    SELECT *
    FROM (
    SELECT  id, 
        'Event Location' AS name, 
        venueName AS snippet, 
        venueLatLng AS coordinates, 
        COUNT(*) AS rCount, 
        (3959 
        * acos(cos(radians('xx.xxxxxx')) 
        * cos(radians(SUBSTRING(venueLatLng, 1, CHARINDEX(',', venueLatLng)-1))) 
        * cos(radians(SUBSTRING(venueLatLng, CHARINDEX(',', venueLatLng) + 1, 1000)) 
        - radians('-xx.xxxxxxx')) 
        + sin(radians('xx.xxxxxx')) 
        * sin(radians(SUBSTRING(venueLatLng, 1, CHARINDEX(',', venueLatLng)-1))))) AS distance 
    FROM marker
    group by id, 'Event Location', venueName, venueLatLng
    ) TMP 
    WHERE distance < 30 
    ORDER BY distance;
    

    否则,如果您需要总行数,最好的办法是用脚本语言(例如PHP)计算它们;或者如果你严格需要用 SQL 来做,你需要添加一个计算计数的窗口,所以添加

     count(*) over ()
    

    但在这种情况下,您会为返回的每一行重复计数值。

    【讨论】:

      【解决方案4】:

      为什么不使用@@ROWCOUNT 从查询中获取结果行数。

      http://msdn.microsoft.com/en-us/library/ms187316.aspx

      【讨论】:

        【解决方案5】:

        您必须将 GROUP BY 添加到不在 COUNT(1) 中的元素。对于您的查询,您需要确定要计算的内容。添加计数,但按主键分组,将保证每个记录分组都是队列,因此 COUNT 将始终为 1。如果您只需要按例如场地名称的 COUNT,那么您的查询可以使用下面的查询并将其调整为分组内需要统计的元素(如添加场地纬度/经度等)。

        SELECT venueName, COUNT(1) FROM marker GROUP BY venueName
        

        【讨论】:

          【解决方案6】:

          Count(*) 将使您的查询成为聚合,因此,除非您使用分组依据,否则结果将是单行。错误消息是说您不能使用其他字段并仍然生成单行

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-10-07
            • 1970-01-01
            • 2011-02-21
            • 1970-01-01
            • 1970-01-01
            • 2016-11-09
            • 1970-01-01
            相关资源
            最近更新 更多