我需要为SQL查询找到解决方案

时间:2019-12-02 02:47:35

标签: sql oracle group-by

我需要一些帮助来列出所有字段,并且仅列出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:不是单组分组功能

This is the original query

2 个答案:

答案 0 :(得分:0)

我发现了2个问题。

  
      
  1. 您的2张桌子之间的链接断开了
  2.   
  3. 在列表中按组包括那些未汇总的列
  4.   
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,这样您就不会错过该月最后一天的结果。