Не уверен в сумме и не уверен, как ограничить поле - PullRequest
0 голосов
/ 05 мая 2019

Попытка написать оператор SELECT для домашней задачи. Я добавил функцию SUM, но не уверен, что ее можно использовать таким образом. А также наличие 3 JOIN, потому что таблицы находятся далеко друг от друга. Честно говоря, если какой-либо из моих нынешних кодов неверен, пожалуйста, сообщите мне. Но моя главная задача - как ограничить поле «прекращено» в таблице.

Вопрос заключается в следующем: извлекать данные из модели данных о продажах для подготовки выписки с указанием имени клиента, адреса электронной почты клиента, названия продукта и общего количества единиц, где общие единицы - это сумма единиц в запасе и единиц в заказе. Ограничьте записи заказами, которые не прекращены (т. Е. 'N' из прекращенного поля). Создайте псевдоним для каждого поля в предложении SELECT, включая «Всего единиц» для вычисляемого столбца. Создайте и используйте псевдоним для каждой таблицы в предложении FROM. Сортировать по общему количеству единиц.

Таблица: https://imgur.com/rdZthcH

SELECT customerFN AS “First Name”, customerEmail AS “Email”, productName AS “Product Name”,
(SUM(unitsInStock)+SUM(unitsonorder)) AS "Total Units"
FROM customer c
JOIN order o
ON c.customerID = o.customerID
JOIN orderLine l
ON o.orderID = l.orderID
JOIN product p
ON l.productCode = p.productCode
WHERE 

После предложения WHERE ничего нет, потому что код неполный. Код неполный, потому что я считаю, что мне нужно какое-то предложение WHERE, чтобы ограничить поле «прекращено». Я просто не знаю, как это сделать. Я искал предложения Where и думаю, что он будет использовать> < или! =. Но я не знаю функцию.

Ответы [ 2 ]

1 голос
/ 05 мая 2019

При отладке этого запроса вы, скорее всего, столкнетесь с несколькими (разными) сообщениями об ошибках. Также: написание запросов без таблиц / данных может быть немного сложнее, так как некоторые аспекты легко упускаются из виду. Таким образом, мы будем использовать несколько тестовых таблиц (включая данные), см. dbfiddle здесь . Приведенный ниже код запроса покажет вам различные ошибки, которые вы можете увидеть, и SQL, необходимый для их исправления. Прочитайте все комментарии в коде.

Реляционная модель (имена столбцов id сокращены) enter image description here

ORA-00903: неверное имя таблицы

В исходном запросе вы используете таблицу ORDER. ЗАКАЗ - зарезервированное слово, см. документация . Не используйте его при именовании таблиц.

ORA-00937: не групповая функция для одной группы

При использовании правильного имени таблицы мы можем выполнить запрос. Добавьте условие в предложение WHERE (см. Ниже). Из-за SUM () в предложениях SELECT и ORDER BY мы получаем сообщение об ошибке. По-видимому, нам нужно добавить в запрос предложение GROUP BY (что сразу приводит к следующему сообщению об ошибке ...)

SELECT 
  c.fn AS "First Name",
  c.email AS "Email",
  p.productName AS "Product Name",
  SUM(p.unitsInStock) + SUM(p.unitsonorder) AS "Total Units" --<- ORA-00937 
FROM customer c
  JOIN orders o     ON c.id = o.id -- table name fixed
  JOIN orderLine l  ON o.id = l.orderid
  JOIN product p    ON l.productCode = p.code
WHERE p.DISCONTINUED = 'N' --<- condition
ORDER BY SUM(p.unitsInStock) + SUM(p.unitsonorder) --<- ORA-00937
;

-- ORA-00937: not a single-group group function
--
-- Cause: A SELECT list cannot include both a group function, 
-- such as AVG, COUNT, MAX, MIN, SUM, STDDEV, or VARIANCE, 
-- and an individual column expression, 
-- unless the individual column expression is included in a GROUP BY clause.
-- see:
-- https://docs.oracle.com/cd/B10501_01/server.920/a96525/e900.htm

ORA-00979: не выражение GROUP BY

SELECT 
  c.fn AS "First Name",
  c.email AS "Email",
  p.productName AS "Product Name",
  SUM(p.unitsInStock) + SUM(p.unitsonorder) AS "Total Units"
FROM customer c
  JOIN orders o     ON c.id = o.id
  JOIN orderLine l  ON o.id = l.orderid
  JOIN product p    ON l.productCode = p.code
WHERE p.DISCONTINUED = 'N'
group by p.productname  --<- causes ORA-00979
ORDER BY SUM(p.unitsInStock) + SUM(p.unitsonorder)
;
-- ORA-00979: not a GROUP BY expression
--
-- Make sure that columns ( listed in the SELECT clause ) that are _not_ "aggregated"
-- are listed in the GROUP BY clause, otherwise you may get an ORA-00937. 

Запрос работает - строки не выбраны!

SELECT 
  c.fn AS "First Name",
  c.email AS "Email",
  p.productName AS "Product Name",
  SUM(p.unitsInStock) + SUM(p.unitsonorder) AS "Total Units"
FROM customer c
  JOIN orders o     ON c.id = o.id
  JOIN orderLine l  ON o.id = l.orderid
  JOIN product p    ON l.productCode = p.code
WHERE p.DISCONTINUED = 'N'
group by p.productname, c.fn, c.email
ORDER BY SUM(p.unitsInStock) + SUM(p.unitsonorder)
;

-- result
no rows selected

Последние штрихи

SELECT 
  c.fn AS "First Name",
  c.email AS "Email",
  p.productName AS "Product Name",
  SUM(p.unitsInStock) + SUM(p.unitsonorder) AS "Total Units"
FROM customer C
  JOIN orders O     ON C.id = O.customerid  --<- JOIN condition amended
  JOIN orderLine L  ON O.id = L.orderid
  JOIN product P    ON L.productCode = P.code
WHERE p.DISCONTINUED = 'N'
group by p.productname, c.fn, c.email
ORDER BY "Total Units" --<- you can use the column alias here - instead of SUM(...)
fetch first 10 rows only -- optional
;

-- result
First Name  Email                        Product Name  Total Units  
Annnora     agrime3@hc360.com            Beans         117          
Arleen      adahlback5@sciencedaily.com  Beans         117          
Gwendolin   gwalder0@unblog.fr           Beans         117          
Tomkin      tdeignan2@eepurl.com         Beans         117          
Alard       aaimeric9@cyberchimps.com    Beans         117          
Jeremiah    jolland4@dagondesign.com     Beans         117          
Melita      meason8@cnbc.com             Beans         117          
Stanwood    slanphere6@walmart.com       Beans         117          
Bobbi       bfireman1@bbb.org            Beans         117          
Idelle      ililly7@pen.io               Beans         117          


10 rows selected. 

Обратите внимание, что вы можете построить запрос, не вставив предварительно строки в таблицы (см. dbfiddle ). Возможно, вам необходимо настроить логику (и т. Д.), Чтобы запрос точно соответствовал требованиям.

1 голос
/ 05 мая 2019

Мне кажется, что вам нужно добавить DISCONTINUED = 'N' в ваше предложение WHERE, или другими словами

SELECT c.customerFN AS "First Name",
       c.customerEmail AS "Email",
       p.productName AS "Product Name",
       SUM(p.unitsInStock) + SUM(p.unitsonorder) AS "Total Units"
  FROM customer c
  JOIN order o
    ON c.customerID = o.customerID
  JOIN orderLine l
    ON o.orderID = l.orderID
  JOIN product p
    ON l.productCode = p.productCode
  WHERE p.DISCONTINUED = 'N'
  ORDER BY SUM(p.unitsInStock) + SUM(p.unitsonorder)

Кроме того, похоже, что вы используете какой-то текстовый процессор для создания своего кода, потому что ваш исходный код содержал причудливые символы открытых и закрытых кавычек (то есть «и») вместо символов кавычки ASCII (то есть "). Эти символы, сгенерированные текстовым процессором, не будут приниматься моими самыми (какими-либо?) Моими языками программирования или инструментами разработки. Например, посмотрите на свой оригинальный вопрос - обратите внимание, что« Имя »и« Электронная почта »не выделены как Строки в вопросе, но «Всего единиц»? Это потому, что только последний из них был заключен в двойные кавычки. инструменты для редактирования, и вы будете намного счастливее.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...