2016-07-27 2 views
1

У меня есть таблица с ценами на книги. То, что я пытаюсь сделать, - это перечислить названия книг с более высокой средней ценой. То, что я до сих пор:Использование подзапроса в списке превышает средние значения

SELECT TITLES.PRICE, AVG(TITLES.PRICE) AS "KOMPARE" 
FROM TITLES, 
      (SELECT PRICE, AVG(PRICE) 
      FROM TITLES 
      GROUP BY Price) subquery1 

WHERE TITLES.PRICE = subquery1.PRICE 
AND subquery1.PRICE > TITLES.KOMPARE 
GROUP BY TITLES.PRICE; 

ошибка, что я получаю то, что TITLES.KOMPARE является недействительным идентификатором. Я не уверен, почему, как я определил его в первом select statement. И это не похоже на то, что я могу поставить AVG(TITLES.PRICE) в заявлении AND. Я был бы всегда благодарен за любого, кто может предложить мне совет! Спасибо.

FYI мое табличное имя TITLES, а цены на книги - ЦЕНА.

+0

50 минут ничего, особенно если вы новичок. –

+0

Использовать 'HAVING', и он будет работать –

ответ

1

для функции агрегации вы должны использовать имеющие и не псевдоним

SELECT TITLES.PRICE, AVG(TITLES.PRICE) AS "KOMPARE" 
FROM TITLES, 
     (SELECT PRICE, AVG(PRICE) 
     FROM TITLES 
     GROUP BY Price) subquery1 
WHERE TITLES.PRICE = subquery1.PRICE 
GROUP BY TITLES.PRICE 
HAVING TITLES.PRICE > AVG(TITLES.PRICE) 

может быть, вы ищете нечто вроде

select TITLES.PRICE,select AVG(TITLES.PRICE) from TITLES ) 
from TITLES 
where TITLES.PRIVE > (select AVG(TITLES.PRICE) from TITLES ); 
+0

Я получаю сообщение об ошибке, а не выражение GROUP BY Expression –

+0

Обновите ответ, но вы не имеете никакого смысла .. – scaisEdge

+0

У меня есть обновление с моим предложением – scaisEdge

0

Ваш запрос не имеет никакого смысла, получая среднюю цену, а группировка по ЦЕНЕ ?

SELECT TITLE.* 
FROM TITLES 
CROSS JOIN 
    (
    SELECT AVG(PRICE) AS avgPrice 
    FROM TITLES 
) subquery1 
WHERE TITLES.PRICE > avgPrice 
; 

Или лучше:

SELECT * 
FROM TITLES 
WHERE TITLES.PRICE > 
    (
    SELECT AVG(PRICE) AS avgPrice 
    FROM TITLES 
) 
; 
0

Вы могли бы работать вместе:

SELECT 
    price 
    , ROUND((SELECT AVG(price) FROM Titles), 2) AS kompare 
FROM Titles 
WHERE price > (SELECT AVG(price) FROM Titles) 
; 

Вы можете получить больше столбцов из заглавий - что не было возможным способом, Вы писали ваше заявление. (Но почему вы GROUP BY цена в первую очередь?)

Вы могли даже разница в списке:

SELECT 
    Titles.* 
    , ROUND(price - (SELECT AVG(price) FROM Titles), 2) AS difference 
FROM Titles 
WHERE price > (SELECT AVG(price) FROM Titles) 
; 

Прокомментируйте, если и как это требует перестройки/более подробно.

Смежные вопросы