3

所以这里是上下文:开发一个 ASP.NET MVC 4 web 应用程序,我在我的数据库中有一个表ProductAllocations,它由两个外键组成:一个来自我的表Products,另一个来自表Persons。我有另一个表Vehicles包含表Products的外键

我想选择按产品分组的分配及其信息(一个产品可以分配多次)。这是我的存储过程:

ALTER PROCEDURE GetAllVehicles

AS

BEGIN

    SET NOCOUNT ON 

    SELECT 

    p.FirstName,
    p.LastName,
    pa.EndDate,
    pr.PurchaseDate,
    pr.SerialNumber,
    pr.CatalogPrice,
    v.PlateNumber,
    v.FirstCirculationDate,
    V.FirstDrivingTax,
    v.UsualDrivingTax

    FROM bm_ProductAllocations AS pa

    INNER JOIN bm_Persons AS p ON pa.Id_Person = p.Id_Person
    INNER JOIN bm_Products AS pr ON pa.Id_Product = pr.Id_Product
    INNER JOIN bm_Vehicles AS v ON pr.Id_Product = v.Id_Product

    GROUP BY pa.Id_Product

END

但是,Group By 子句正在生成错误:Column 'bm_Persons.FirstName' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.我正在使用 Visual Studio 2010。

我是 SQL 新手,所以我不知道发生了什么。

4

4 回答 4

6

分组字段,您需要使用聚合等,或者您需要在子句中包含列,请参阅以下链接:SQL Group By & summarizing valuessummax

SELECT   p.FirstName
        ,p.LastName
        ,pa.EndDate
        ,pr.PurchaseDate
        ,pr.SerialNumber
        ,pr.CatalogPrice
        ,v.PlateNumber
        ,v.FirstCirculationDate
        ,v.FirstDrivingTax
        ,v.UsualDrivingTax
FROM     bm_ProductAllocations AS pa
INNER JOIN bm_Persons AS p ON pa.Id_Person = p.Id_Person
INNER JOIN bm_Products AS pr ON pa.Id_Product = pr.Id_Product
INNER JOIN bm_Vehicles AS v ON pr.Id_Product = v.Id_Product
GROUP BY pa.Id_Product
        ,p.FirstName
        ,p.LastName
        ,pa.EndDate
        ,pr.PurchaseDate
        ,pr.SerialNumber
        ,pr.CatalogPrice
        ,v.PlateNumber
        ,v.FirstCirculationDate
        ,v.FirstDrivingTax
        ,v.UsualDrivingTax;
于 2013-05-01T08:20:59.597 回答
6

要使用 GROUP BY 函数,您需要确保 SELECT 语句中的所有字段都在聚合函数中(例如 SUM() 或 COUNT()),或者它们需要在 GROUP BY 函数中。

于 2013-05-01T08:21:35.463 回答
1

使用时,Group BY您应该将要选择的字段放在Group By子句中,还是应该在它们上使用聚合函数,例如

SELECT 

    pa.Id_Product,Min(p.FirstName) as Firstname,Min(p.LastName) as LastName

    FROM bm_ProductAllocations AS pa

    INNER JOIN bm_Persons AS p ON pa.Id_Person = p.Id_Person
    INNER JOIN bm_Products AS pr ON pa.Id_Product = pr.Id_Product
    INNER JOIN bm_Vehicles AS v ON pr.Id_Product = v.Id_Product

    GROUP BY pa.Id_Product

你应该知道你要使用什么聚合函数,有很多 Min,max,Sum...

有关更多信息,请阅读此GROUP BY (Transact-SQL)

于 2013-05-01T08:20:55.750 回答
0

您不必将聚合函数与 Group By 一起使用,但是任何未受聚合函数约束但仍被选中的列都需要包含在 Group By 中

你到底想用这个查询做什么?

于 2013-05-01T08:21:28.847 回答