这个表是为了演示的目的,但我有物理表,我需要将其值插入到另一个表中。此表中没有主键。我的问题是 - 使用聚合值(使用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.
答案 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子句。
希望它有所帮助。