Sql 在联接中使用聚合函数时,如何使用GROUPBY子句?
我想连接三个表并计算表A的总和(数量)。 我尝试了一些东西,得到了想要的结果。但基于聚合函数和GROUPBY子句,我仍然感到困惑 当通过连接两个或多个表来计算总值时,我们需要在GROUPBY子句中提到哪些列,为什么我们需要给出这些列 例如:这是我的表和所需的查询Sql 在联接中使用聚合函数时,如何使用GROUPBY子句?,sql,sql-server,sql-server-2005,group-by,aggregate-functions,Sql,Sql Server,Sql Server 2005,Group By,Aggregate Functions,我想连接三个表并计算表A的总和(数量)。 我尝试了一些东西,得到了想要的结果。但基于聚合函数和GROUPBY子句,我仍然感到困惑 当通过连接两个或多个表来计算总值时,我们需要在GROUPBY子句中提到哪些列,为什么我们需要给出这些列 例如:这是我的表和所需的查询 TableA: ItemID, JobOrderID, CustomerID, DivisionID, Quantity TableB: ItemID, ItemName, SpecificationID TableC: Specifi
TableA: ItemID, JobOrderID, CustomerID, DivisionID, Quantity
TableB: ItemID, ItemName, SpecificationID
TableC: SpecificationID, SpecificationName
TableD: DivisionID, DivisionName
TableE: JobOrderID, JobOrderNo.
TableF: CustomerID, CustomerName
我想根据ItemID
、CustomerID
、JobOrderID
和DivisionID
获取总和(数量)
我编写了以下查询,它运行良好。但是,如果我删除GROUPBY子句中的任何列,它不会给出期望的结果。为什么?GROUPBY子句在这里做什么?使用聚合函数时如何指定GROUPBY子句?这是我的问题
SELECT
B.ItemName + ' - ' + C.SpecificationName AS 'ItemName',
SUM(A.Quantity) AS 'Quantity',
A.ItemID,
D.DivisionName,
F.CustomerName,
E.JobOrderNo,
A.DivisionID,
A.JobOrderID,
A.CustomerID
FROM
TableA A
INNER JOIN TableB B ON B.ItemID = A.ItemID
INNER JOIN TableC C ON C.SpecificationID = B.SpecificationID
INNER JOIN TableD D ON D.DivisionID = A.DivisionID
LEFT JOIN TableE E ON E.JobOrderID = A.JobOrderID
LEFT JOIN TableF F ON F.CustomerID = A.CustomerID
WHERE
A.ItemID = @ItemID
GROUP BY
A.ItemID,
A.JobOrderID,
A.DivisionID,
A.CustomerID,
D.DivisionName,
F.CustomerName,
E.JobOrderNo,
B.ItemName,
C.SpecificationName
请任何人以Group By子句为例给出建议。根据SQL Server 2008 R2中一个或多个列或表达式的值将选定的行集分组为一组摘要行。每组返回一行。SELECT子句列表中的聚合函数提供关于每个组而不是单个行的信息
SELECT a.City, COUNT(bea.AddressID) AS EmployeeCount
FROM Person.BusinessEntityAddress AS bea
INNER JOIN Person.Address AS a
ON bea.AddressID = a.AddressID
GROUP BY a.City
GROUPBY子句具有
符合ISO标准的语法和
不符合ISO的语法。只有一个
语法样式可以在单个
SELECT语句。使用ISO
所有新工作的兼容语法。这个
提供了不符合ISO的语法
为了向后兼容
在符合ISO标准的语法中,列表中任何非聚集表达式中的每个表或视图列都必须包含在分组依据
列表中
select pub_id, type, avg(price), sum(total_sales)
from titles
group by pub_id, type
提及
Sybase或不符合ISO的语法解除了对您可以执行的操作的限制
在选择列表中包括或忽略
对于包含分组依据的查询
:
- 选择列表中的列不限于分组列
和与向量一起使用的列
聚合
- group by指定的列不限于非聚合列
选择列表中的列
例如:
select type, title_id, avg(price), avg(advance)
from titles
group by type
CREATE TABLE #a (ida int, name varchar(50))
CREATE TABLE #b (ida int, number int)
INSERT INTO #a VALUES(1,'one')
INSERT INTO #a VALUES(2,'two')
INSERT INTO #b VALUES(1,2)
INSERT INTO #b VALUES(1,3)
INSERT INTO #b VALUES(2,1)
SELECT DISTINCT a.ida, sum(number) OVER (PARTITION BY a.ida) FROM #a a
INNER JOIN #b b on a.ida = b.ida
groupby
对于指定列的任何唯一组合,都会进行聚合(如sum、min等)。如果未在GROUP BY
子句或聚合函数中指定某个列名,则SQL引擎不知道该列应返回哪一个值。若要使用sum等聚合函数而不使用GROUP BY,请使用over子句
见:
例如:
select type, title_id, avg(price), avg(advance)
from titles
group by type
CREATE TABLE #a (ida int, name varchar(50))
CREATE TABLE #b (ida int, number int)
INSERT INTO #a VALUES(1,'one')
INSERT INTO #a VALUES(2,'two')
INSERT INTO #b VALUES(1,2)
INSERT INTO #b VALUES(1,3)
INSERT INTO #b VALUES(2,1)
SELECT DISTINCT a.ida, sum(number) OVER (PARTITION BY a.ida) FROM #a a
INNER JOIN #b b on a.ida = b.ida
因此,如果我们选择了一些列means,我们也需要在GROUPBY子句中给出这些列。是这样吗?这更有意义,group by只显示组的一个代表行,因此所有非聚合字段都应包含在group by子句中。因此,如果我们选择一些列,我们也需要在group by子句中指定这些列。是吗?是的,所选列必须在分组依据中,或者在类似于:选择最大值(列名称)