专栏''在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中

时间:2017-05-02 19:32:41

标签: sql-server group-by aggregate

这个表是为了演示的目的,但我有物理表,我需要将其值插入到另一个表中。此表中没有主键。我的问题是 - 使用聚合值(使用SUM,AVG等)和非聚合字段获取一个SELECT语句中的所有数据的唯一方法是列出GROUP BY子句中的所有非聚合字段或者是还有其他一些方法吗?在GROUP BY子句中列出大量字段会产生什么影响? 以下是样本:

    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]

如果我没有在GROUP BY子句中包含ColE和ColC,我会得到:

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.

3 个答案:

答案 0 :(得分:0)

每当使用聚合函数时,SELECT语句中的所有非聚合值都需要出现在group by语句中。如果要插入聚合值,则需要使用group by。话虽如此,为什么需要使用SUM函数?只有在您合并的条目重复时才需要这样做。以下查询避免了SUM,因此不需要分组。

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

答案 1 :(得分:0)

如果您想查看所有记录,则根本无法使用GROUP BY。如果您需要整个表格中的SUM(ColE)和SUM(ColD)等中间值,则可以计算它们并将put them计算为variable。然后你可以使用你想要的变量。

DECLARE @SumE DECIMAL(18, 4);
SELECT @SumE = SUM(ColE) FROM #SummaryData

答案 2 :(得分:0)

这完全正确,Group by具有所有非聚合函数。

但为什么?

简单演示: -

create table emp (empid int , departmentName varchar(15))
go
insert into emp values (1 , 'HR')
insert into emp values (2 , 'HR')
insert into emp values (3 , 'HR')
insert into emp values (4 , 'Sales')
insert into emp values (5 , 'Sales')
insert into emp values (7 , 'Developemnet')
insert into emp values (8 , 'Developemnet')
insert into emp values (9 , 'Developemnet')
insert into emp values (10 , 'Developemnet')
insert into emp values (11 , 'Developemnet')

所需结果为: -

countEmpID  departmentName
5            Developemnet
3               HR
2               Sales

为了达到这个目的,你必须选择count(empid)& departmentName然后使用非聚合函数(departmentName)进行分组,因为这是通过下一个代码创建组的方法: -

select count (empid) countEmpID, departmentName
from emp
group by departmentName

这样,如果你没有将非aggragate函数放在group by中,下一个错误就会引发: -

  

Msg 8120,Level 16,State 1,Line 15 Column' emp.departmentName'是   在选择列表中无效,因为它不包含在任何一个中   聚合函数或GROUP BY子句。

希望它有所帮助。