2013-09-13 3 views
0

В следующем запросе я получаю сообщение об ошибке «LettingPercent» в четвертой строке «Недопустимое имя столбца». Я хочу использовать каждый результат, возвращаемый в lettingpercentage для расчета платы за ПРЕПЯТСТВОВАТЬ, который находится на четвертой строчке моего заявленияerror in select statement

declare @let varchar(50) 
select 
CONVERT(varchar(50), InstructionLettingFee.percentage)+'%' as 'LettingPercent', 
CONVERT(decimal(18,2), LettingPercent/(100 * DealFees.pddrl_TermRent)) as LettingFee 
from tableOne 
left outer join tableTwo LettingInstruction on LettingInstruction.ColumnOne=  tableOne.ColumnOne 
left outer join TableThree InstructionLettingFee on InstructionLettingFee.ColumnForOne = LettingInstruction.ColumTwo 
left outer join TableFour DealFees on DealFees.ColumnOne = pDeal.ColumnOne 

ответ

1

Одиночные кавычки не нужны. Но проблема в том, что вы ссылаетесь на значение в следующей строке. Вместо того, чтобы вернуться к исходным данным:

declare @let varchar(50) 
select CONVERT(varchar(50), InstructionLettingFee.percentage)+'%') as LettingPercent, 
     CONVERT(decimal(18,2), InstructionLettingFee.percentage/(100 * DealFees.pddrl_TermRent)) as LettingFee 
from tableOne 
left outer join tableTwo LettingInstruction on LettingInstruction.ColumnOne=  tableOne.ColumnOne 
left outer join TableThree InstructionLettingFee on InstructionLettingFee.ColumnForOne = LettingInstruction.ColumTwo 
left outer join TableFour DealFees on DealFees.ColumnOne = pDeal.ColumnOne; 

EDIT:

Для предотвращения деления на 0, положить case вокруг расчета:

 (case when DealFees.pddrl_TermRent > 0 
      then CONVERT(decimal(18,2), InstructionLettingFee.percentage/(100 * DealFees.pddrl_TermRent)) 
     end) as LettingFee 
+0

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

1

Вы не можете ссылаться на псевдоним, как что , вам нужно будет повторить заявление. Даже если бы вы могли превратить LettingPercent в строку. Try:

declare @let varchar(50) 
    select 
    CONVERT(varchar(50), InstructionLettingFee.percentage)+'%' as 'LettingPercent', 
LettingFee = 
case InstructionLettingFee.percentage 
when 0 then cast(0 as decimal(18,2)) 
else CONVERT(decimal(18,2), InstructionLettingFee.percentage/(100 * DealFees.pddrl_TermRent)) 
end 
    from tableOne 
    left outer join tableTwo LettingInstruction on LettingInstruction.ColumnOne=  tableOne.ColumnOne 
    left outer join TableThree InstructionLettingFee on InstructionLettingFee.ColumnForOne = LettingInstruction.ColumTwo 
    left outer join TableFour DealFees on DealFees.ColumnOne = pDeal.ColumnOne 
+0

Эта часть запроса имеет неправильный синтаксис: + '%' как 'LettingPercent' – Sonam

+0

hi jenson, можете ли вы помочь с утверждением case? im, все еще получающий a, не может делить на ноль. Спасибо –

+0

@ife, попробуйте пожалуйста –

0

Вы ссылаетесь псевдоним в запросе, который является неправильным, пожалуйста, попробуйте следующий запрос:

select CONVERT(varchar(50), LettingPercent)+'% LettingPercent', 
CONVERT(decimal(18,2), LettingPercent/(100 * pddrl_TermRent)) as LettingFee 
from 
(select 
InstructionLettingFee.percentage as LettingPercent, 
DealFees.pddrl_TermRent 
from tableOne 
left outer join tableTwo LettingInstruction on LettingInstruction.ColumnOne=  tableOne.ColumnOne 
left outer join TableThree InstructionLettingFee on InstructionLettingFee.ColumnForOne = LettingInstruction.ColumTwo 
left outer join TableFour DealFees on DealFees.ColumnOne = pDeal.ColumnOne) 
+0

LettingPercent - это varchar (50), то u разделите его на ненужный внешний запрос –

+0

Спасибо, что указали это, я исправил его сейчас. – Sonam

0

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

Вы можете использовать производную таблицу для достижения этой, хотя:

SELECT 
    CONVERT(varchar(50), LettingPercent)+ '%' as LettingPercent, 
    CONVERT(decimal(18,2), LettingPercent/(100 * TermRent)) as LettingFee 
FROM (
    SELECT 
     InstructionLettingFee.percentage AS LettingPercent, 
     DealFees.pddrl_TermRent AS TermRent 
    from tableOne 
    left outer join tableTwo LettingInstruction on LettingInstruction.ColumnOne = tableOne.ColumnOne 
    left outer join TableThree InstructionLettingFee on InstructionLettingFee.ColumnForOne = LettingInstruction.ColumTwo 
    left outer join TableFour DealFees on DealFees.ColumnOne = pDeal.ColumnOne 
) A 
0

При использовании ключевого слова AS и не имея каких-либо пробелов в ваших Alīses, нет никакой необходимости цитировать строку. Но если вы хотите добавить процитировать ваши псевдонимы, то вы должны использовать двойные кавычки, а не одиночные кавычки, т.е.

... AS «LettingPercent»

+0

На самом деле нет! Стандарты ANSI предусматривают использование двойных кавычек. Если вы используете старую базу данных, такую ​​как Sybase, предпочтительными являются одинарные кавычки. В некоторых реализациях баз данных одна кавычка может работать, но не является предпочтительной. Вы также можете использовать [] для псевдонимов, но снова стандарты ANSI содержат двойные кавычки и являются самым безопасным способом. –

+0

Я предлагаю вам прочитать мой ответ и прокомментировать еще раз. Не все версии sql-сервера поддерживают одинарные кавычки. –

+0

Я не уверен, что пользователь «jenson-button-event» пытается сделать, добавив неверные комментарии грубым способом, а затем удалив их. Также совершенно бесполезно редактировать ответ, добавляя пробел в конце строки. Это какая-то спам-игра? –