0

Percentage次のクエリがあり、集計を含む式で where 句を使用したいと考えています。

SELECT Percentage = CONVERT(DECIMAL(10,1),100 - COUNT(some_irrelevant_column))
FROM Product P INNER JOIN Item PD
ON PD.ProductId = P.ProductId
WHERE Percentage < 50;

これにより、次のエラーが発生します。

列名 'Percentage' が無効です。

4

4 に答える 4

5

Common Table Expressionを使用できます:

with cte as (
    select CONVERT(DECIMAL(10,1),100 - (CAST(COUNT(DISTINCT case when PD.ExceptionCode  != ' ' then PD.Id  END) as float)/CAST(COUNT(PD.Id) as float)*100)) as Percentage
from Product as P
    inner join Item as PD on PD.ProductId = P.ProductId
)
select Percentage from cte where Percentage < 50

subqueryを使用することは可能ですが、私にとっては CTE の方が読みやすいです

select *
from (
    select CONVERT(DECIMAL(10,1),100 - (CAST(COUNT(DISTINCT case when PD.ExceptionCode  != ' ' then PD.Id  END) as float)/CAST(COUNT(PD.Id) as float)*100)) as Percentage
from Product as P
    inner join Item as PD on PD.ProductId = P.ProductId
) as A
where A.Percentage < 50

を使用してこれを解決することもできます、読みやすく保守しにくいでしょう。

select CONVERT(DECIMAL(10,1),100 - (CAST(COUNT(DISTINCT case when PD.ExceptionCode != ' ' then PD.Id  END) as float)/CAST(COUNT(PD.Id) as float)*100)) as Percentage
from Product as P
    inner join Item as PD on PD.ProductId = P.ProductId
having CONVERT(DECIMAL(10,1),100 - (CAST(COUNT(DISTINCT case when PD.ExceptionCode != ' ' then PD.Id  END) as float)/CAST(COUNT(PD.Id) as float)*100)) < 50
于 2013-08-14T17:22:39.947 に答える
2

集計関数に基づいて結果セットをフィルタリングするには、それをHAVING句ではなく句に含める必要がありWHEREます。

于 2013-08-14T17:22:29.113 に答える
0

集計は、HAVING 句または選択リストに含まれるサブクエリ内にない限り、WHERE 句に表示されない場合があり、集計される列は外部参照です。

于 2013-08-14T17:33:23.677 に答える