2017-12-20 23 views
0

WhereまたはHaving句をクエリにどのように適用しますか?私はHaving句に問題があります。where/having句を持つSQLクエリのケース

DECLARE @dtDate DATE 
SET @dtDate = GETDATE(); 

with EMS as 
    (
     select * from ReportingView.WTA where FiscalMonth = DATENAME(MONTH, @dtDate) + ', ' + DATENAME(YEAR, @dtDate) and ProductGroup = 'AAD' 
    ) 

select 
     [ID] 
     ,(CASE 
      WHEN Entitlements <= 0 THEN '0' 
      ELSE CAST([Activations] as float)/[Entitlements] 
     END) as Utilization 
from EMS 
**HAVING Utilization >= .25** 
+0

はCOUNT( \t \t CASE \t \t \t資格<= 0 THEN '0' ELSE CAST(floatとして[フィールドアクティベーションキャップ])/ [資格] 端部を有し、このよう あり )> 0.25 – emie

答えて

0

wherehavingの両方の句がクエリの最後にあります。両方をお持ちの場合はwherehavingの前になります。

havinggroup byとのみ使用するため、お客様の場合はhavingが機能しません。

WHERE

SELECT 
    * 
FROM 
    EMS 
WHERE 
    Utilization >= 0.25 

HAVING

0: havingは、本質的に、集計値について where句(例えば、 sumcountなど)


例です

SELECT col1, count(*) FROM EMS GROUP BY col1 HAVING count(*) > 10 

HAVINGWHERE

SELECT 
    col1, count(*) 
FROM 
    EMS 
WHERE 
    Utilization >= 0.25 
GROUP BY 
    col1 
HAVING 
    count(*) > 10 

編集:この変更されたクエリはあなたのために働く必要があります。元のクエリでCTEを使用していた理由がわかりませんが、caseロジックをCTEに移動しました。

with EMS as 
(
    select 
     [ID], 
     (
      CASE 
       WHEN Entitlements <= 0 THEN '0' 
       ELSE CAST([Activations] as float)/[Entitlements] 
      END 
     ) as Utilization 
    from 
     ReportingView.WTA 
    where 
     FiscalMonth = DATENAME(MONTH, @dtDate) + ', ' + DATENAME(YEAR, @dtDate) 
     and ProductGroup = 'AAD' 
) 
select 
    * 
from 
    EMS 
where 
    Utilizaiton >= .25 
1

HAVINGキーワードは、GROUP BYも使用している場合にのみ使用されます。あなたが望むのはWHEREですが、サブ選択でラップしない限り、Utilizationを参照することはできません。

+0

だから...これは? ( \t \t \t CASE \t \t \t \t WHEN資格 = .25 GROUP BY ID、[アクティブ化]、[エンタイトルメント] – emie

関連する問題