2015-11-26 2 views
0

Я очень новичок в SQL, MS Access & PostgreSQL. Мне очень быстро дали эту задачу. Сначала я прочитал основные синтаксисы SQL, а затем написал это только с логикой. Каким-то образом я получаю эту ошибку: SELECTКак получить правильный оператор SELECT в SQL?

[http://i.stack.imgur.com/bqjFy.png]

В таблице и имена столбцов являются правильными. Вот краткое описание того, что моей целью является enter image description here

SELECT 
    change_incoming_area AS Bodenfläche, 
    CASE 
    WHEN change_type_id = 2 
    AND (NOT cng.city_old_id=cng.city_new_id 
    AND EXTRACT(YEAR FROM cng.date_change) = EXTRACT(YEAR FROM tb_city_annual_population.population_year)) THEN 
     ROUND((cng.change_incoming_area/SELECT pop.city_area FROM tb_city_annual_population pop WHERE pop.city_id=cng.city_old_id)*100,2) 
    WHEN change_type_id = 2 
    AND (cng.city_old_id=cng.city_new_id 
    AND EXTRACT(YEAR FROM cng.date_change) = EXTRACT(YEAR FROM tb_city_annual_population.population_year) 
    AND cng.change_incoming_area<SELECT pop.city_area FROM tb_city_annual_population pop WHERE pop.city_id=cng.city_old_id) THEN 
     ROUND(((SELECT pop.city_area FROM tb_city_annual_population pop WHERE pop.city_id=cng.city_old_id AS origarea-cng.change_incoming_area)/origarea)*100,2) 
    WHEN change_type_id = 2 
    AND (cng.city_old_id=cng.city_new_id 
    AND EXTRACT(YEAR FROM cng.date_change) = EXTRACT(YEAR FROM tb_city_annual_population.population_year) 
    AND ((cng.change_incoming_area+SELECT pop.city_area FROM tb_city_annual_population pop WHERE pop.city_id=cng.city_old_id AS origarea3)/origarea3)*100>100) THEN 
     ROUND(((cng.change_incoming_area+SELECT pop.city_area FROM tb_city_annual_population pop WHERE pop.city_id=cng.city_old_id AS origarea2)/origarea2)*100,2) 
    ELSE 100 
    END 
FROM tb_change cng; 
+0

Синтаксические ошибки. SELECT внутри другого SELECT (т. Е. Подзапроса) должен быть заключен в круглые скобки. – jarlh

+0

Трудно понять, что вы пытаетесь сделать. Возможно, вы могли бы сделать JOIN вместо всех этих подзапросов? – jarlh

+0

Упростите, пока не сработает. Тогда вы знаете, где проблема, и можете сосредоточиться на этом. –

ответ

1

Как jarlh прокомментировал сразу: подзапрос должен быть в скобках.

Эта линия

ROUND((cng.change_incoming_area/select ...) * 100, 2) 

должен быть

ROUND((cng.change_incoming_area/(select ...)) * 100, 2) 

или просто

ROUND(cng.change_incoming_area/(select ...) * 100, 2) 

Что касается самого подзапроса: оно должно привести к одному значению только, конечно. С именем таблицы tb_city_annual_population Я ожидаю, что у него будет рекорд по городу и году. Но в вашем где предложение, вы только ограничение по городам:

SELECT pop.city_area 
    FROM tb_city_annual_population pop 
    WHERE pop.city_id = cng.city_old_id 

Разве это не даст вам несколько записей (по одному за каждый год)? Может быть, вы хотите, чтобы это было что-то вроде этого, вместо:

SELECT pop.city_area 
    FROM tb_city_annual_population pop 
    WHERE pop.city_id = cng.city_old_id 
    AND pop.year = EXTRACT(YEAR FROM cng.date_change) 

Есть несколько ошибок:

ROUND(((cng.change_incoming_area+SELECT pop.city_area FROM tb_city_annual_population pop 
     WHERE pop.city_id=cng.city_old_id AS origarea2)/origarea2)*100,2) 

Что такое AS origarea2 для? Вы не можете использовать AS в середине выражения. Это должно быть

ROUND((cng.change_incoming_area + (SELECT pop.city_area FROM tb_city_annual_population pop 
     WHERE pop.city_id = cng.city_old_id))/origarea2 * 100, 2) 

То же самое для AS origarea3 и AS origarea.

Тогда в

AND EXTRACT(YEAR FROM cng.date_change) = 
    EXTRACT(YEAR FROM tb_city_annual_population.population_year)) THEN 

вы обратитесь к tb_city_annual_population.population_year, но не выбрать из tb_city_annual_population, вы выбираете из tb_change.

Затем вы извлекаете год с population_year. Итак, population_year - это дата? Название предполагает, что это целое число, представляющее год.

+0

Я поставил круглую скобку вокруг операторов запроса SELECT, но все равно получаю ту же ошибку. – Salman

+0

Да, вы правы. Я добавил часть года тоже к подзапросам. Но все же я получаю ошибки. – Salman

+0

Я обновил свой ответ, чтобы показать больше ошибок. Там может быть еще больше. Я предлагаю вам построить свой запрос от малого до большого, так что вы найдете ошибки проще. Например. начните с одного предложения WHEN. Удачи. –

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