#mysql #sql
#mysql #sql
Вопрос:
Я пытаюсь заставить этот SQL-запрос работать. Он хочет, чтобы я перечислил все продажи продуктов, для которых проданные единицы больше, чем средние единицы, проданные для этого продукта. В дополнение к этому мне нужно добавить коррелированный встроенный подзапрос в список средних единиц, проданных за продукт.
Я создал здесь приличный фрагмент кода, который соответствует логике, которой меня учили в классе. Код прокомментирован, чтобы описать, что я пытаюсь выполнить с каждым уникальным блоком. Я также добавляю задачу, которую мне нужно выполнить для коррелированного подзапроса
SELECT * FROM invoice
-- Display sales data from invoice table
join product
on product.P_CODE = line.P_CODE
join line
on line.INV_NUMBER = invoice.INV_NUMBER
-- link tables together to bridge relevant data
having invoice.INV_TOTAL > avg(invoice.INV_TOTAL);
-- display the sales whose total is greater than the average total
/* TODO: Add a correlated in-line sub query to the list of
average units sold per product here */
Попытка выполнить приведенный выше запрос возвращает
Код ошибки: 1054. Строка неизвестного столбца.P_CODE’ в предложении on’
Комментарии:
1. Спасибо за выделение предложений @John Conde. Я понятия не имею, как это сделать сам
2. Отладка является частью работы программиста.
FROM invoice join product on product.P_CODE = line.P_CODE
Итак, откудаline.P_CODE
это происходит? У вас есть только таблицаinvoice
иproduct
.3. Также
HAVING
безGROUP BY
?4. Примеры данных, желаемые результаты и описание проблемы помогли бы. Ваш запрос не имеет смысла. Вы используете
having
с nogroup by
. Вы сравниваете неагрегированный столбец с результатом агрегирования.
Ответ №1:
Я не знаю, какую проблему вы пытаетесь решить. Но если вам нужны счета, общая сумма которых больше среднего, тогда вам не нужны все join
s. Но вам нужно вычислить среднее значение в подзапросе.
Что-то вроде этого:
SELECT i.*
FROM invoice i
WHERE i.inv_total > (SELECT AVG(i2.inv_total)
FROM invoice i2);
Вы бы присоединились к остальным таблицам, если бы вам нужны были столбцы из них. И вы можете это сделать — having
предложение не требуется, только where
.
Если вы хотите сделать это для продуктов, то это будет что-то вроде этого
SELECT l.*
FROM lines l
WHERE l.units_sold > (SELECT AVG(l2.units_sold)
FROM lines l2);
Это следует точно такой же схеме.
Комментарии:
1. Спасибо, похоже, он это сделал. Я собираюсь добавить соответствующий подзапрос строки в конце, если смогу, и добавить сортировку по, чтобы отсортировать данные от наибольшего к наименьшему по убыванию
Ответ №2:
Переключите позиции ваших JOIN
s, то line
есть перед product
. И ваш HAVING
не имеет смысла. Возможно, вы хотите использовать подзапрос a WHERE
и a для получения среднего значения.
SELECT *
FROM invoice i1
INNER JOIN line l1
ON l1.INV_NUMBER = i1.INV_NUMBER
INNER JOIN product p1
ON p1.P_CODE = l1.P_CODE
WHERE invoice.INV_TOTAL > (SELECT avg(i2.INV_TOTAL)
FROM invoice i2);
И наличие столбца INV_TOTAL
в invoice
, предположительно суммы количества и цены из line
s, указывает на то, что вы должны нормализовать свою схему здесь.