在Joins中使用Aggregate函数时如何使用Group By子句?

the*_*van 7 sql sql-server group-by sql-server-2005 aggregate-functions

我想加入三个表并计算表A的总和(数量).我试了一下,得到了所需的输出.但我仍然混淆基于聚合函数和Group By子句.

在通过连接两个或多个表来计算总和值时,我们需要在Group By子句中提及哪些列,为什么我们需要提供这些列?

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

TableA: ItemID, JobOrderID, CustomerID, DivisionID, Quantity
TableB: ItemID, ItemName, SpecificationID
TableC: SpecificationID, SpecificationName
TableD: DivisionID, DivisionName
TableE: JobOrderID, JobOrderNo.
TableF: CustomerID, CustomerName
Run Code Online (Sandbox Code Playgroud)

我想根据获得的总和(数量)ItemID,CustomerID,JobOrderIDDivisionID.

我写了以下查询,它工作正常.但是,如果我删除Group By子句中的任何列,则它不会提供所需的结果.为什么?Group By子句在这里做什么?如何在使用Aggregate函数时指定Group By子句?这是我的查询.

    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
Run Code Online (Sandbox Code Playgroud)

任何人请以此为例,对Group By Clause提出建议.

Pio*_*cik 8

GROUP BY对于指定列的任何唯一组合,都会进行聚合(如sum,min等).如果您没有在GROUP BY子句或聚合函数中指定某个列名,则SQL引擎不知道它应该为该类列返回哪个值.

  • 是的,选定的列必须在 `group by` 或在 agreagtion 中,例如:`select max(column_name)` (2认同)

Akr*_*hda 5

GROUP BY(Transact-SQL)通过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
Run Code Online (Sandbox Code Playgroud)

GROUP BY子句具有符合ISO的语法和不符合ISO的语法.在单个SELECT语句中只能使用一种语法样式.对所有新工作使用ISO兼容语法.提供非ISO兼容语法是为了向后兼容.

ISO兼容语法中的每个表或视图列中的任何非聚合表达式列表必须包含在GROUP BY列表中.

select pub_id, type, avg(price), sum(total_sales)
from titles
group by pub_id, type
Run Code Online (Sandbox Code Playgroud)

请参阅将查询结果组织到组中:group by子句

SYBASE不符合ISO标准的语法升降机上你可以包含或省略的限制select,其中包括一个查询的列表group by:

  • 选择列表中的列不限于与向量聚合一起使用的分组列和列.

  • group by指定的列不限于选择列表中的那些非聚合列.

例:

select type, title_id, avg(price), avg(advance) 
from titles 
group by type 
Run Code Online (Sandbox Code Playgroud)