Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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 在联接中使用聚合函数时,如何使用GROUPBY子句?_Sql_Sql Server_Sql Server 2005_Group By_Aggregate Functions - Fatal编程技术网

Sql 在联接中使用聚合函数时,如何使用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

我想连接三个表并计算表A的总和(数量)。 我尝试了一些东西,得到了想要的结果。但基于聚合函数和GROUPBY子句,我仍然感到困惑

当通过连接两个或多个表来计算总值时,我们需要在GROUPBY子句中提到哪些列,为什么我们需要给出这些列

例如:这是我的表和所需的查询

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子句中指定这些列。是吗?是的,所选列必须在
分组依据中,或者在类似于:
选择最大值(列名称)