2

1 日平均 20 リットル以上の牛乳を生産したすべての牛のテーブルを返す関数を作成しようとしています。これは私が思いついたコードです:

CREATE FUNCTION SuperCows (@year int)
RETURNS @supercows TABLE (
    Name nvarchar(50),
    AvgMilk decimal(4,2)
)
BEGIN
    INSERT @supercows
        SELECT c.Name, AVG(CAST(p.MilkQuantity AS decimal(4,2))) FROM MilkProduction AS p
        INNER JOIN Cows AS c ON c.IDCow = p.CowID
        WHERE YEAR(p.Date) = @year
        GROUP BY p.CowID
        HAVING AVG(CAST(p.MilkQuantity AS decimal(4,2))) > 20
    RETURN
END
GO

関数を作成しようとしたときに発生するエラーは次のとおりです。

Column 'Cows.Name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

私のSQLに関する知識はかなり限られているため、誰かがこれを解決するのを手伝ってくれることを望んでいました.

4

2 に答える 2

2

group by リストに Cows.name を追加する必要があります。

SELECT c.Name, AVG(CAST(p.MilkQuantity AS decimal(4,2))) FROM MilkProduction AS p
    INNER JOIN Cows AS c ON c.IDCow = p.CowID
    WHERE YEAR(p.Date) = @year
    GROUP BY p.CowID, c.Name
    HAVING AVG(CAST(p.MilkQuantity AS decimal(4,2))) > 20

group by選択するすべてのフィールドを使用している場合は、グループ化されているリストに含まれているか、列に集計関数が適用されている必要があります ( AVGMINMAXSUMなど)。列。

于 2013-09-20T19:44:28.827 に答える
1

変化する

GROUP BY p.CowID

GROUP BY c.Name

同じ名前の牛が複数いる場合、これは機能しません。その場合、それらの合計 MilkQuantity が 1 つのレコードに結合されます。

于 2013-09-20T19:45:30.697 に答える