Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 列“”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中_Sql Server_Group By_Aggregate - Fatal编程技术网

Sql server 列“”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中

Sql server 列“”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中,sql-server,group-by,aggregate,Sql Server,Group By,Aggregate,此表用于演示,但我有一个物理表,需要将其值插入另一个表中。此表中没有主键。我的问题是-使用SUM、AVG等聚合值获取一个SELECT语句中的所有数据的唯一方法是,非聚合字段列出GROUP BY子句中的所有非聚合字段,还是还有其他方法?在GROUPBY子句中列出大量字段会有什么影响? 以下是示例: CREATE TABLE #SummaryData( [Col_Name] varchar(20) not NULL, [Col_Date] datetime NUL

此表用于演示,但我有一个物理表,需要将其值插入另一个表中。此表中没有主键。我的问题是-使用SUM、AVG等聚合值获取一个SELECT语句中的所有数据的唯一方法是,非聚合字段列出GROUP BY子句中的所有非聚合字段,还是还有其他方法?在GROUPBY子句中列出大量字段会有什么影响? 以下是示例:

    CREATE TABLE #SummaryData(
       [Col_Name] varchar(20) not NULL,
       [Col_Date] datetime NULL,
       [ColC] [decimal](18, 4) NULL,
       [ColD] [decimal](18, 4) NULL,
       [ColE] [decimal](18, 4) NULL
       )

       INSERT INTO #SummaryData ([Col_Name],[Col_Date],[ColC],[ColD],[ColE])
       VALUES ('BOA'      ,'03/10/2017',     2.4507 ,33536.0000   ,0.0073)

       INSERT INTO #SummaryData ([Col_Name],[Col_Date],[ColC],[ColD],[ColE])
       VALUES ('BOA'      , '03/11/2017'    , 9.9419,47041.0000, 0.0088)

       INSERT INTO #SummaryData ([Col_Name],[Col_Date],[ColC],[ColD],[ColE])
       VALUES ('Merrill Lynch',    '03/10/2017',     2.8152,       32371.0000,   0.0042)
       INSERT INTO #SummaryData ([Col_Name],[Col_Date],[ColC],[ColD],[ColE])
       VALUES ('Merrill Lynch',    '03/11/2017',     9.9333,       35671.0000,   0.0444)

--NOTE: Next SELECT will be used to INSERT data into another table, so I need all fields

       SELECT [Col_Name],[Col_Date],[ColC],
       CASE WHEN SUM([ColE]) > 0 THEN SUM([ColD])/SUM([ColE]) ELSE 0 END AS SomeVal , [ColE]
       FROM #SummaryData
       GROUP BY [Col_Name],[Col_Date],[ColE],[ColC]
如果我没有将ColE和ColC包括在GROUP BY子句中,我会得到:

Msg 8120, Level 16, State 1, Line 21
Column '#SummaryData.Col_Date' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

无论何时使用聚合函数,SELECT语句中的所有非聚合值都需要显示在GROUPBY语句中。如果要插入聚合值,则需要使用group by。那么,为什么需要使用SUM函数呢?只有在合并的条目重复时才需要这样做。下面的查询避免求和,因此不需要group by

SELECT [Col_Name],[Col_Date],[ColC],
CASE WHEN [ColE] > 0 THEN [ColD]/[ColE] ELSE 0 END AS SomeVal , [ColE]
FROM @SummaryData

如果要查看所有记录,则根本不能使用GROUP BY。如果需要整个表中的中间值,如SUMColE和SUMColD,则可以计算它们并将其转换为一个值。然后,您可以随意使用这些变量

DECLARE @SumE DECIMAL(18, 4);
SELECT @SumE = SUM(ColE) FROM #SummaryData
这完全正确,GROUPBY具有所有非聚合函数

但是为什么呢

简单演示:-

预期的结果是:-

因此,为了实现这一点,您必须选择count empid&departmentName,然后使用非聚合函数departmentName进行分组,因为这是通过下一个代码进行分组的方法:-

select count (empid) countEmpID, departmentName
from emp
group by departmentName
这样,如果您没有将非加积门函数放在group by中,则会出现下一个错误:-

Msg 8120,16级,状态1,第15行“emp.departmentName”列为 在选择列表中无效,因为它不包含在 聚合函数或GROUPBY子句


希望有帮助。

没错。除非字段选择中的每个字段实例都在聚合函数中,否则该字段必须在GROUP BY子句中。因为您的SELECT同时返回ColC和ColE,所以您需要将它们包括在GROUP BY中。然而,很难说出您想要什么结果,因为您的示例似乎根本不需要聚合。我建议您发布预期结果。从select中删除cole和colc,或者将它们添加到group by。实际上,这只是一个示例,但我有一个很长的查询,其中我必须使用许多聚合和非聚合字段。1.通过使用SUM,值将被舍入。2.可以按所有剩余的非聚合字段分组吗?或者,我应该先插入非聚合字段,然后用聚合字段更新表吗?按非聚合字段分组就可以了。Group by的性能受到影响,但聚合需要Group by,并在聚合时防止重复记录。
countEmpID  departmentName
5            Developemnet
3               HR
2               Sales
select count (empid) countEmpID, departmentName
from emp
group by departmentName