Sql 子查询给定列中的select查询在选择列表中无效,因为它不包含错误

Sql 子查询给定列中的select查询在选择列表中无效,因为它不包含错误,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有以下查询,我想得到我的数据的总和计数 SELECT TI.[text] as zone, YEAR (ER.Inserted) as [Year], SUM(CONVERT(INT,DRT.RDRT)) as RDRT, SUM(CONVERT(INT,DRT.FACT)) as FACT , SUM(CONVERT(INT,DRT.ERU)) as ERU, ( SELECT COUNT(ER1.ReportID) FROM dbo.E

我有以下查询,我想得到我的数据的总和计数

SELECT  
  TI.[text] as zone,
  YEAR (ER.Inserted) as [Year], 
  SUM(CONVERT(INT,DRT.RDRT)) as RDRT,
  SUM(CONVERT(INT,DRT.FACT)) as FACT ,
  SUM(CONVERT(INT,DRT.ERU))  as ERU,
  (
     SELECT COUNT(ER1.ReportID) 
     FROM dbo.EW_Reports ER1
     INNER JOIN  dbo.EW_Report_InformationManagement ERI ON ER1.ReportID = ERI.ReportID
     INNER JOIN EW_Report_Country ERC1 ON   ER1.ReportID = ERC1.ReportID 
     INNER JOIN ApplicationDB.dbo.Country C1 ON ERC1.CountryID = C1.countryId 
     INNER JOIN ApplicationDB.dbo.Region R1 ON C1.regionId = R1.regionId
     INNER JOIN ApplicationDB.dbo.Zone Z1  ON R1.zoneId = Z1.zoneId 
     WHERE ERI.EmergencyAppeal IS NOT NULL
      AND (YEAR ( ER1.Inserted) = YEAR ( ER.Inserted))
      AND Z1.zoneId =  Z.zoneId     
   ) as emergencyAppeals    
FROM     EW_Reports ER 
INNER JOIN EW_DisasterResponseTools DRT ON   ER.ReportID = DRT.ReportID 
INNER JOIN EW_Report_Country ERC ON   ER.ReportID = ERC.ReportID  
INNER JOIN ApplicationDB.dbo.Country C ON ERC.CountryID = c.countryId 
INNER JOIN ApplicationDB.dbo.Region R ON c.regionId = R.regionId
INNER JOIN ApplicationDB.dbo.Zone Z ON R.zoneId = Z.zoneId 
INNER JOIN ApplicationDB.dbo.Translation T ON Z.translationId = T.translationId
INNER JOIN ApplicationDB.dbo.TranslationItem TI ON T.translationId = TI.translationId
INNER JOIN EW_lofDisasterTypes D ON ER.DisasterTypeID = D.TranslationID AND D.LanguageID = 1 AND TI.languageID = 1      
WHERE (YEAR ( ER.Inserted) IN (2011,2012))
GROUP BY TI.[text], YEAR (ER.Inserted)  
但它给出了以下错误

列“ApplicationDB.dbo.Zone.zoneId”在选择列表中无效 因为它既不包含在聚合函数中,也不包含在 按子句分组


请帮助我解决此错误。

您的表中已有太多ApplicationDB.dbo.Zone.zoneId记录

只需在组中添加ApplicationDB.dbo.Zone.zoneId,问题就会解决

Select ....
.....
GROUP BY TI.[text], YEAR (ER.Inserted) ,ApplicationDB.dbo.Zone.zoneId
对于我在子查询中使用ApplicationDB.dbo.Zone.zoneId时为什么需要在我的组中添加ApplicationDB.dbo.zoneId的问题,这是因为您在子查询中执行了外部条件

SELECT
----
(
SELECT
-----
INNER JOIN ApplicationDB.dbo.Zone Z1  ON R1.zoneId = Z1.zoneId 
WHERE
----
AND Z1.zoneId =  Z.zoneId 
)
-----
INNER JOIN ApplicationDB.dbo.Zone Z ON R.zoneId = Z.zoneId
WHERE (YEAR ( ER.Inserted) IN (2011,2012)) 
------
请注意,您在不同的年份有不同的情况

因此,您的数据流可能如下所示

ZoneID    Years     Record
  1       2011        1000
  1       2012        1000

同一区域id包含不同的年份,如果没有正确的分组,sql无法对年份列进行分组

它显示了错误,因为您在子查询where条件中使用了该字段


您需要在组中添加ApplicationDB.dbo.Zone.zoneId,谢谢它解决了我的问题,但是您能告诉我为什么我需要在我的组中添加ApplicationDB.dbo.Zone.zoneId,因为我正在子查询中使用它吗?答案已更新,为了更好地解释,也许您可以看看这个,