【问题标题】:How to aggregate all data in SQL for a specific column? Or how to avoid '...not contained in either an aggregate function'如何聚合 SQL 中特定列的所有数据?或者如何避免“......不包含在任何一个聚合函数中”
【发布时间】:2016-06-16 15:16:24
【问题描述】:

一个简单的问题:我怎样才能避免错误

不包含在聚合函数或GROUP BY 子句中

我想为每个国家/地区分组。有可能吗?

SELECT  country_code AS 'Country', UserInfo.Id       
FROM [ip2location].[dbo].[ip2location_db1] as IpRange with(nolock)
JOIN [dbo].[USERINFO] as UserInfo
    ON (SELECT dbo.IPAddressToInteger (UserInfo.LastIp)) BETWEEN IpRange.ip_from AND IpRange.ip_to
WHERE 
    UserInfo.RoomId = 84 AND 
    country_code != 'UA' AND 
    country_code != 'BY' AND 
    country_code != 'KZ' AND 
    country_code != 'RU' 
GROUP BY country_code

【问题讨论】:

  • 我想我已经找到了自己问题的答案:根本不要使用 GROUP BY :)
  • 当您使用 GROUP BY 时,SQL 服务器使用聚合来为您的 GROUP BY 语句中存在的每个值返回一个值。这意味着,如果您想检索比分组字段和聚合更多的信息,您应该将字段添加到 group by 子句或考虑其他选项(如窗口函数(例如 PARTITION BY COUNTRY_CODE))

标签: sql sql-server group-by aggregation


【解决方案1】:

您的查询的问题在于SELECT 子句中的UserInfo.Id 字段。因为它不是GROUP BY 的一部分,SQL Server 不知道如何处理它。

当使用 GROUP BY 时,必须使用 aggregate functions 之一聚合未出现在分组中的任何字段。

考虑这个示例表:

Country Sales
UK      10.10
UK      20.10
USA     15.25

按国家分组将返回:

Country
UK
USA

将销售额添加到 SELECT 会导致问题。有三个销售值,只有两行。 SQL Server 需要有关如何将三个源行转换为 2 个输出行的说明。你可以SUM 销售。那将返回:

Count   Sales
UK      30.20
USA     15.25

或者您可以随时将 Sales 添加到 group by。这将返回原来的三行。

根据经验,当使用 GROUP BY 时,任何未包含在分组中的字段都必须包含在聚合函数(SUM、MIN、MAX 等)中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2020-07-20
    • 2020-03-29
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多