我需要一些帮助来列出所有字段,并且仅列出11月从INGREDIENT表和INGREDIENT_PURCHASE_LIST表中进行的购买 每个项目的总金额。按排序的降序对结果集进行排序。
CREATE TABLE ingredient
(
ingredient_id NUMBER(4,0) PRIMARY KEY,
ingredient_name VARCHAR2(100) NOT NULL
);
CREATE TABLE ingredient_purchase_list
(
ing_pl_id NUMBER(4,0) PRIMARY KEY,
date_ordered DATE ,
quantity VARCHAR2(15),
unit VARCHAR(15),
unit_price NUMBER(4,2) NOT NULL,
ingredient_id NUMBER(4,0),
CONSTRAINT ingredient_id_fk FOREIGN KEY (ingredient_id)
REFERENCES ingredient (ingredient_id));
我有这个:
SELECT i.ingredient_id, i.ingredient_name, ip.date_ordered, ip.quantity, ip.unit, ip.unit_price, (SUM(ip.unit_price * ip.quantity)) "TOTAL"
FROM ingredient_purchase_list ip, ingredient i
WHERE ip.date_ordered BETWEEN '11-01-2019' AND '11-30-2019';
GROUP BY ip.date_ordered;
我收到此错误:
ORA-00937:不是单组分组功能
答案 0 :(得分:0)
我发现了2个问题。
- 您的2张桌子之间的链接断开了
- 在列表中按组包括那些未汇总的列
SELECT i.ingredient_id, i.ingredient_name, ip.date_ordered, ip.quantity, ip.unit
, ip.unit_price, (SUM(ip.unit_price * ip.quantity)) "TOTAL"
FROM ingredient_purchase_list ip
INNER JOIN ingredient i on i.ingredient_id = ip.ingredient_id
WHERE ip.date_ordered BETWEEN '11-01-2019' AND '11-30-2019'
GROUP BY ip.date_ordered, i.ingredient_id, i.ingredient_name, ip.quantity, ip.unit
, ip.unit_price;
答案 1 :(得分:0)
这个问题有点模棱两可。听起来您想要每种成分一行。目前尚不清楚“每个项目的总金额是什么意思”,因此让总价格和数量都做吧。
然后,如果要总计,“订购日期”是什么?可以有多个日期。因此,让我将其解释为“最近订购的日期”。
您的查询只是缺少JOIN
。 从不在FROM
子句中使用逗号。 始终使用正确,明确的标准JOIN
语法。:
SELECT i.ingredient_id, i.ingredient_name,
SUM(ip.quantity) as total_quantity,
SUM(ip.unit_price * ip.quantity) as total_price
FROM ingredient_purchase_list ip JOIN
ingredient i
ON i.ingredient_id = ip.ingredient_id
WHERE ip.date_ordered >= DATE '2019-11-01' AND
ip.date_ordered < DATE '2019-12-01'
GROUP BY ip.date_ordered, i.ingredient_name
ORDER BY MAX(ip.date_ordered);
最后,您会注意到我更改了日期逻辑。 Oracle date
数据类型具有时间成分-在查询结果中通常不可见。为了安全起见,请使用不等式逻辑,而不要使用between
,这样您就不会错过该月最后一天的结果。