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

Я пытаюсь заставить этот запрос SQL работать. Он хочет, чтобы я перечислил все продажи продукта, для которых проданные единицы больше, чем средние единицы, проданные для этого продукта. В дополнение к этому мне нужно добавить коррелированный встроенный подзапрос в список средних единиц, проданных по продукту.

Я создал приличный кусок кода, который соответствует логике, которой меня учили в классе. Код прокомментирован, чтобы описать то, что я пытаюсь выполнить с каждым уникальным блоком. Я также добавляю TODO, который мне нужно сделать для коррелированного подзапроса

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. Неизвестный столбец 'line.P_CODE' in 'в предложении'

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

Я не знаю, какую проблему вы пытаетесь решить. Но если вам нужны счета-фактуры, сумма которых превышает среднюю, вам не нужны все 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);

Это следует точно так же.

0 голосов
/ 13 апреля 2019

Переключение позиций ваших JOIN с, т.е. line до product. И ваш HAVING не имеет смысла. Возможно, вы хотите использовать WHERE и подзапрос для получения среднего значения.

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

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