2016-05-03 6 views
0

私はしばらくの間、"Column 'examplecolumn' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause."エラーで問題を抱えていました。私の誇りに思うほど、最終的な修正はすべての不快な列をGROUP BY句に追加することでした。いくつかの調査をした後、私はまだあなたに非常に醜いテーブルを与えるのではなく、なぜこのエラーを投げるのかを完全には知ることはできませんが、それは重要な部分ではありません。`GROUP BY`はどの集合メソッドを使用するかをどのように決定するのですか?

私の研究によれば、GROUP BYは、渡した列に基づいて同じ行をマージすることが重要です。データを一緒に追加する適切な方法を選択する。好奇心のために、私は自分の既存のクエリを複製し、小さな変更を加えました。

元を::

SELECT [ProductName] 
    ,[CompanyName] 
    ,[CategoryID] AS 'CategoryName' 
    ,SUM(Quantity) AS 'Total Ordered' 
FROM [Order Details] AS t1 
INNER JOIN Products AS t2 
    ON t1.ProductID = t2.ProductID 
INNER JOIN Suppliers AS t3 
    ON t2.SupplierID = t3.SupplierID 
GROUP BY ProductName, CategoryID, CompanyName 

変更されたバージョン:

SELECT [ProductName] 
    ,[CompanyName] 
    ,[CategoryID] AS 'CategoryName' 
    ,Quantity AS 'Total Ordered' 
FROM [Order Details] AS t1 
INNER JOIN Products AS t2 
    ON t1.ProductID = t2.ProductID 
INNER JOIN Suppliers AS t3 
    ON t2.SupplierID = t3.SupplierID 
GROUP BY ProductName, CategoryID, CompanyName, Quantity 

を私はGROUP BYと信じていた作品BYかGROUPの私の理解では、それは私に同じ出力を与えているはず正しかった場合句は集計方法としてSUM(数量)を使用します。それはしませんでした。実際には、エラーメッセージを削除する以外に、どうしたのか分かりません。ここで

は、出力のスクリーンショットです:output of the two queries

それはGROUP BYの私の理解が間違っている明らかです。私は、集計方法が列挙された列にあるデータの種類によって決まると信じていました。そうではないので、どうすればGROUP BYが機能しますか?

答えて

3

GROUP BYは、でなく、となる列を示します。そのようなものとして、これらの列の値のユニークな組み合わせごとに、1行の出力が生成されます。

あなたの出力で必要な残りの列のすべての集合体にする必要があります - それは、エラーメッセージがあなたを伝えるものだ - それは、集約が適切であるサーバーを伝えるためにあなた望んでいます。

+0

私はすでに同じテーブル*の主キーでグループ化しているにもかかわらず、わずかな接線で、この集約されていない列を 'GROUP BY' *に含めなければならないという要件は、SQLを持つ私のペットのピープルの1つです。面倒でグループ分けの意図がわかりにくく、情報を不必要に複製してクエリを混乱させるため、クエリを編集する次の人が微妙なバグを導入する可能性が高くなります。データベースの井戸*は、グループ内で複数の値を持つことはないことをキー制約から伝えることができます。重複して指定する必要はありません。 –

+0

@IlmariKaronen - 今私は好奇心が強いです - もしあなたがグループの名前が分かれていれば、あなたは何を集計していますか? –

+0

通常、主キーをグループ化しているテーブルと多対1の関係を持つ別のテーブルのものです。 'CompanyId'が' Companies'テーブルのプライマリキーであるところで、 'SELECT CompanyId、CompanyName、COUNT(EmployeeId)AS EmployeeCount、WebsiteURL ASUs(CompanyId)GROUP BY CompanyId'のようなものです。 (このクエリは、SQL Serverでは当然失敗します。なぜなら、 'CompanyName'と' WebsiteURL'という冗長な列を 'GROUP BY'から除外したからです。) –

0

集計方法はGROUP BY句では決まっていません。 SQLで指定する必要があります。 2番目のSQLクエリは、カラムGROUP BY句の値によって形成できるユニークな組み合わせを提供します。

関連する問題