2016-03-03 9 views
6

と表現BYないGROUP私は、Oracle 11gで、次の例を試してみました:http://joshualande.com/filters-joins-aggregations/ORA-00979:単純な例

SELECT c.recipe_name, 
COUNT(a.ingredient_id), 
SUM(a.amount*b.ingredient_price) 
FROM recipe_ingredients a 
JOIN ingredients b 
ON a.ingredient_id = b.ingredient_id 
JOIN recipes c 
ON a.recipe_id = c.recipe_id 
GROUP BY a.recipe_id; 

私はSQLエラーを取得:クエリで使用ORA-00979: not a GROUP BY expression...

テーブルを

CREATE TABLE recipes (
    recipe_id INT NOT NULL, 
    recipe_name VARCHAR(30) NOT NULL, 
    PRIMARY KEY (recipe_id), 
    UNIQUE (recipe_name) 
); 

INSERT INTO RECIPES (RECIPE_ID, RECIPE_NAME) VALUES (1, 'Tacos'); 
INSERT INTO RECIPES (recipe_id, recipe_name) VALUES (2, 'Tomato Soup'); 
INSERT INTO RECIPES (recipe_id, recipe_name) VALUES (3, 'Grilled Cheese'); 

CREATE TABLE ingredients (
    ingredient_id INT NOT NULL, 
    ingredient_name VARCHAR(30) NOT NULL, 
    ingredient_price INT NOT NULL, 
    PRIMARY KEY (ingredient_id), 
    UNIQUE (ingredient_name) 
); 

INSERT INTO ingredients (ingredient_id, ingredient_name, ingredient_price) VALUES (1, 'Beef', 5); 
INSERT INTO ingredients (ingredient_id, ingredient_name, ingredient_price) VALUES (2, 'Lettuce', 1); 
INSERT INTO ingredients (ingredient_id, ingredient_name, ingredient_price) VALUES (3, 'Tomatoes', 2); 
INSERT INTO ingredients (ingredient_id, ingredient_name, ingredient_price) VALUES (4, 'Taco Shell', 2); 
INSERT INTO ingredients (ingredient_id, ingredient_name, ingredient_price) VALUES (5, 'Cheese', 3); 
INSERT INTO ingredients (ingredient_id, ingredient_name, ingredient_price) VALUES (6, 'Milk', 1); 
INSERT INTO ingredients (ingredient_id, ingredient_name, ingredient_price) VALUES (7, 'Bread', 2); 

CREATE TABLE recipe_ingredients (
    recipe_id int NOT NULL, 
    ingredient_id INT NOT NULL, 
    amount INT NOT NULL, 
    PRIMARY KEY (recipe_id,ingredient_id) 
); 

INSERT INTO recipe_ingredients (recipe_id, ingredient_id, amount) VALUES (1,1,1); 
INSERT INTO recipe_ingredients (recipe_id, ingredient_id, amount) VALUES (1,2,2); 
INSERT INTO recipe_ingredients (recipe_id, ingredient_id, amount) VALUES (1,3,2); 
INSERT INTO recipe_ingredients (recipe_id, ingredient_id, amount) VALUES (1,4,3); 
INSERT INTO recipe_ingredients (recipe_id, ingredient_id, amount) VALUES (1,5,1); 
INSERT INTO recipe_ingredients (recipe_id, ingredient_id, amount) VALUES (2,3,2); 
INSERT INTO recipe_ingredients (recipe_id, ingredient_id, amount) VALUES (2,6,1); 
INSERT INTO recipe_ingredients (recipe_id, ingredient_id, amount) VALUES (3,5,1); 
INSERT INTO recipe_ingredients (recipe_id, ingredient_id, amount) VALUES (3,7,2); 

私はこの質問が既に何度か尋ねられたことは知っていますが、plzはこの例を私に説明しています。

+0

をルールによって一般的なGROUPは言う:「GROUP BY句が指定されている場合は、SELECTリスト内の各列参照がグループ化列を識別またはどちらかでなければなりませんセット関数の引数。 "説明のために – jarlh

答えて

4

、あなただけのGROUP BY句に表示されるか(SUMなど)集計されているかという表現を参照することができます。 c.recipe_nameはそのようにはなりません。

a.recipe_idでグループ化すると、c.recipe_name(各グループ内)のユニークな結果につながることがあります。そして、オラクルはこの情報も引き出す​​ことができるかもしれません。しかし、SQLはより厳密で、式をGROUP BY句に入れる必要があります。

だから、単に書く:

SELECT c.recipe_name, 
    COUNT(a.ingredient_id), 
    SUM(a.amount*b.ingredient_price) 
FROM recipe_ingredients a 
JOIN ingredients b 
    ON a.ingredient_id = b.ingredient_id 
JOIN recipes c 
    ON a.recipe_id = c.recipe_id 
GROUP BY a.recipe_id, c.recipe_name; 
+0

説明していただきありがとうございます。今はすべて明らかです。 – dsz36

3

またGROUP BY句でフィールドc.recipe_nameを配置する必要があります:あなたのクエリと

SELECT c.recipe_name, 
     COUNT(a.ingredient_id) AS cnt, 
     SUM(a.amount*b.ingredient_price) AS sum 
FROM recipe_ingredients a 
JOIN ingredients b 
    ON a.ingredient_id = b.ingredient_id 
JOIN recipes c 
    ON a.recipe_id = c.recipe_id 
GROUP BY c.recipe_name, a.recipe_id; 

問題は、非凝集列は、c.recipe_nameのように、SELECT句に表示されていることです。

出力:SELECT句で

recipe_name  cnt sum 
------------------------ 
Grilled Cheese 2 7 
Tacos   5 20 
Tomato Soup  2 5 
+0

Thx。 – dsz36

0
SELECT 
    c.recipe_name, 
    COUNT(a.ingredient_id), 
    SUM(a.amount*b.ingredient_price) 
FROM recipe_ingredients a 
JOIN ingredients b 
    ON a.ingredient_id = b.ingredient_id 
JOIN recipes c 
    ON a.recipe_id = c.recipe_id 
GROUP BY c.recipe_name 
+0

おそらく、なぜこれがうまくいくのか説明しようとするべきです。 – Cyclonecode