2015-05-17 5 views
0

Я знаю, что это было задано раньше, но я просмотрел другие вопросы, и мой запрос все равно не сработает. У меня есть таблица с статистикой ватин MLB за последние 100 лет или около того, я пытаюсь найти игрока, homeruns и процент от общего гомерона этого года (2012), который составлял hrs игрока.Ошибка Oracle Invalid Identifier

запрос:

select playerid, hr, hr/sum(hr) over (partition by playerid, yearid)*100 p 
from mlbbattingstats 
where yearid=2012 and p != 0 
order by hr; 

ошибка:

Error at line 3:
ORA-00904: "P": invalid identifier

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

+0

Возможный дубликат: http://stackoverflow.com/questions/3852831/how-to-use-alias-in-where-clause –

ответ

2

Вы не можете ссылаться на псевдоним столбца на том же уровне запросов (кроме order by). Вам нужно обернуть заявление в производной таблице:

select * 
from (
    select playerid, hr, hr/sum(hr) over (partition by playerid, yearid)*100 p 
    from mlbbattingstats 
    where yearid = 2012 
) 
where p <> 0 
order by hr; 
+0

спасибо, это имеет смысл, но теперь я получаю ошибку на ERROR по строке 6: ORA-00904: «YEARID»: неверный идентификатор – user3587186

+0

@ user3587186: ah right. Скопируйте и вставьте ошибку, извините. Вы можете переместить 'yearid = 2012' в производную таблицу (что я сделал) или добавить« yearid »в список выбора и сохранить оба условия вместе во внешнем запросе (производительность будет неважной для этого простого запроса) –

1

Если p <> 0, то hr <> 0. Таким образом, ваш запрос, казалось бы, что эквивалентно:

select playerid, hr, 
     hr/sum(hr) over (partition by playerid, yearid)*100 as p 
from mlbbattingstats 
where yearid = 2012 and hr <> 0 
order by hr; 

Ваша первоначальная проблема в том, что вы не можете использовать псевдоним столбца, определенный в select в пункте where, как на том же уровне.