2016-11-03 18 views
3

私は以下のフィールドの表を持っています。HAVING条件付きグループ化

enter image description here

私は私が私の意図した結果を取得することができませんが、このようにやっていた

Account_Id Address_Id Status 
AC001  ADD12345 Invalid_vod 
AC003  ADD12348 Invalid_vod 
AC003  ADD12349 Invalid_vod 

ACCOUNT_IDグループ内のみ Invalid_vodにステータスのような出力を取得したいと思います。

select [Account_Id],[Address_Id],[Status] 
    from [DBFile] 
    group by [Account_Id],[Address_Id],[Status] 
    having [Status] = 'Invalid_vod' 

答えて

2

あなたはこのためにCOUNTのウィンドウのバージョンを使用することができます。

;with cte as (
    select [Account_Id], [Address_Id], [Status], 
      count(case when [Status] <> 'Invalid_vod' then 1 end) 
      over (partition by [Account_Id]) AS cnt 
    from [DBFile] 
) 
select [Account_Id], [Address_Id], [Status] 
from cte 
where cnt = 0 
2

あなたはこの

;with cte as (
select Accountid, count(distinct status) as Distcnt from DBFile 
group by accountid 
) 
select * from DBFile where accountid in (select accountid from cte where Distcnt = 1) 
and status = 'Invalid_vod' 
0
WITH CandidateAccounts AS (
    SELECT Account_Id 
     FROM DBFile 
     WHERE Status = 'Invalid_vod' 
    EXCEPT 
    SELECT Account_Id 
     FROM DBFile 
     WHERE Status <> 'Invalid_vod') 
SELECT Account_Id, Address_Id, Status 
    FROM DBFile 
WHERE Status = 'Invalid_vod' -- not enough data to be 
           -- sure about this 
     AND Account_Id IN (SELECT Account_Id 
          FROM CandidateAccounts); 
のように問い合わせることができます
関連する問題