Мне нужно найти решение для запроса SQL - PullRequest
0 голосов
/ 02 декабря 2019

Мне нужна помощь, чтобы перечислить все поля и только покупки за ноябрь из таблицы 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:не групповая функция для одной группы

Это оригинальный запрос

Ответы [ 2 ]

0 голосов
/ 02 декабря 2019

Вопрос немного двусмысленный. Похоже, вы хотите один ряд на ингредиент. Неясно, что означает «общая сумма для каждого элемента», поэтому давайте сделаем как общую цену, так и количество.

Тогда, если вы хотите получить итоги, что такое «заказанная дата»? Там может быть несколько дат. Итак, позвольте мне интерпретировать это как «самая последняя заказанная дата».

В вашем запросе просто отсутствует 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, чтобы не пропустить результаты последнего дня месяца.

0 голосов
/ 02 декабря 2019

Я обнаружил 2 проблемы.

  1. Между вашими двумя таблицами есть разорванная связь
  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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...