Запрос SQL Server, имеющий предложение - PullRequest
0 голосов
/ 17 сентября 2018

В приведенном ниже запросе я получаю сообщение об ошибке после предложения HAVING. Любая помощь будет оценена. Заранее спасибо.

Select round(TaxableAmount,0) as t, round(((TaxValue*100)/TaxPercentage),0)as t2 from VoucherTaxDetail where 
TaxPercentage<>0 and TaxableAmount>0 and TableName in('TVPayment','Payment') group by transactionId having t<>t2 

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

SQL Server требует, чтобы вы повторили выражение в предложении HAVING (или использовали CTE или подзапрос).У вас нет функций агрегирования, поэтому я предполагаю, что вы намерены:

select round(sum(TaxableAmount), 0) as t,
       round(sum(TaxValue*100/TaxPercentage), 0) as t2
from VoucherTaxDetail
where TaxPercentage <> 0 and TaxableAmount > 0 and
      TableName in ('TVPayment', 'Payment')
group by transactionId
having round(sum(TaxableAmount), 0) <> round(sum(TaxValue*100/TaxPercentage), 0);
0 голосов
/ 18 сентября 2018

Однако я нашел этот ответ для моего запроса. Я просто подумал об использовании вывода внутреннего запроса с предложением WITH и CTE. По сути, я понял, что мы не можем использовать вывод псевдонима в предложении HAVING для применения условий.

 with cte as (
 Select round(TaxableAmount,0) as t,
 round(((TaxValue*100)/TaxPercentage),0)as t2 
 from VoucherTaxDetail where
 TaxPercentage<>0 and TaxableAmount>0 and TableName in('TVPayment','Payment'))
 select * from cte where t<>t2 
0 голосов
/ 17 сентября 2018

Вы не можете использовать псевдонимы столбцов в предложении HAVING.Хитрость заключается в том, чтобы обернуть запрос в производную таблицу (подзапрос).Тогда вы можете иметь эти псевдонимы во внешнем предложении WHERE.

select *
from
(
    select round(TaxableAmount,0) as t, round(((TaxValue*100)/TaxPercentage),0)as t2
    from VoucherTaxDetail 
    where  TaxPercentage<>0 and TaxableAmount>0 and TableName in('TVPayment','Payment')
    group by transactionId
) dt
where t<>t2
...