Получение неизвестного столбца в предложении on, ошибка 1054, для этого SQL-запроса

#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 с no group 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, указывает на то, что вы должны нормализовать свою схему здесь.