多个内连接组'未包含在聚合函数或GROUP BY子句中'

时间:2015-12-22 10:45:56

标签: sql sql-server sql-server-2008

在尝试对多个内部联接进行分组时,我一直收到以下错误。

  

消息8120,级别16,状态1,行1列'address.Address1'是   在选择列表中无效,因为它不包含在任何一个中   聚合函数或GROUP BY子句。

以下是我的代码,无法弄清楚我做错了什么。

select Ad.Address1, Ad.Address2, Ad.PostalCode, Tw.Town, Co.County, CI.InstallationName,C.CompanyName
FROM address as AD

Inner Join 
(Select TownId, Town From
Town as Tw)TW 
ON Tw.TownID=Ad.TownID

Inner Join
(select County, CountyID From
County as CO) CO
ON CO.countyid=Ad.CountyID

Inner Join
(select ClientID, InstallationName, AddressID From
ClientInstallations as CI) CI
ON CI.AddressID=Ad.AddressID

Inner Join
(select ClientID, CompanyName From
Client as C) C
ON C.ClientID=CI.ClientID

Where Address1 <> '' and Address2 <> '' and PostalCode <> '' and Town <> '' and County is not null
Group By CompanyName

为凌乱的代码道歉,刚开始学习这些东西,所以会很感激一些提示。

非常感谢 萨姆

3 个答案:

答案 0 :(得分:1)

你做错了什么,正在为mysql使用sql server类似的脚本。在sql server(以及其他每个理智的DBMS)中,每个选定的属性(不在聚合函数中)必须位于group by中。在您的情况下,我根本不理解您使用group by的原因,因为您不使用聚合函数。因此,您的解决方案应该是删除group by

根据评论进行修改

如果您只想计算每个companyname的记录,则应select companyname, count(1) cnt from (your selection) group by companyname。如果您还想要其他属性,则必须将它们包含在group by中。

答案 1 :(得分:0)

查看您要从数据库中提取的内容列表(第一个&#39;选择&#39;后面的字段):

select Ad.Address1, Ad.Address2, Ad.PostalCode, Tw.Town, Co.County, CI.InstallationName,C.CompanyName

然而,在完成所有联接后,您按

进行分组
Group By CompanyName

您的错误消息实际上只是遇到的第一个错误。你对Ad.Address2然后是Ad.PostalCode然后Tw.Town等获得相同的响应...如果省略第一个字段,则为Co.County,CI.InstallationName

规则是 - 如果选择字段列表,则每个字段应该在group by子句中或以某种方式聚合。 它确实有意义 - 如果你不聚合(即 - 将多个值转换成一个 - sum(..), count(..), min(..)等),那么这个字段有许多可能的值。要么使每个组合成为一个新行(按组分组),要么选择一种合适的方法从可能的多个组中获取单个值

答案 2 :(得分:0)

我从您的评论中理解的是您想要的是存在多少同一公司名称的记录。如果是这种情况,那么您可以将查询重写为:

select COUNT(*),
       C.CompanyName
FROM [address] as AD
Inner Join 
(Select TownId, Town FROM Town as Tw)TW 
ON Tw.TownID=Ad.TownID
Inner Join
(select County, CountyID FROM County as CO) CO
ON CO.countyid=Ad.CountyID
Inner Join
(select ClientID, InstallationName, AddressID From
ClientInstallations as CI) CI
ON CI.AddressID=Ad.AddressID
Inner Join
(select ClientID, CompanyName FROM 
Client as C) C
ON C.ClientID=CI.ClientID
Where Address1 <> '' and Address2 <> '' and PostalCode <> '' and Town <> '' and County is not null
Group By CompanyName