2015-07-28 83 views
5

我有如下表:過濾行值

Card(
    MembershipNumber, 
    EmbossLine, 
    status, 
    EmbossName 
) 

樣本數據

(0009,0321,'E0','Finn') 
(0009,0322,'E1','Finn') 
(0004,0356,'E0','Mary') 
(0004,0398,'E0','Mary') 
(0004,0382,'E1','Mary') 

我想檢索行這樣,只有那些行應該出現有countMembershipNumber > 1 AND計數爲status='E0' > 1

對於實施例查詢應返回以下結果

(0004,0356,'E0','Mary') 
(0004,0398,'E0','Mary') 

我具有用於與MembershipNumber計數濾波它的查詢,但找不出如何按狀態進行過濾=「E0」。這裏的查詢到目前爲止

SELECT * 
FROM (SELECT *, 
       Count(MembershipNumber)OVER(partition BY EmbossName) AS cnt 
     FROM card) A 
WHERE cnt > 1 
+0

添加'WHERE狀態=「E0''在你的子查詢。 –

+0

我已經做了,但後來它返回所有狀態='E0'的那些。在我的例子中,它也會返回'(0009,0321,'E0','Finn')'。不要求 – Nuke

+0

確定,因爲它的工作原理在我的機器罰款:'SELECT * FROM(SELECT *, 計數(MembershipNumber OVER(PARTITION BY EmbossName))AS CNT 從存儲卡中 \t \t WHERE狀態=「E0 ' \t \t)A WHERE cnt> 1' –

回答

2

你可以只添加WHERE status = 'E0'你的子查詢中:

SQL Fiddle信貸憤怒的公牛的小提琴

SELECT * 
FROM (
    SELECT *, 
     COUNT(MembershipNumber) OVER(PARTITION BY EmbossName) AS cnt 
    FROM card 
    WHERE status = 'E0' 
)A 
WHERE cnt > 1 
0

嘗試:

WITH cnt AS (
    SELECT MembershipNumber, status 
     FROM Card 
     WHERE status = 'E0' 
     GROUP BY MembershipNumber, status 
     HAVING COUNT(MembershipNumber) > 1 AND COUNT(status) > 1 
) 
SELECT c.* 
    FROM Card c 
    INNER JOIN cnt 
     ON c.MembershipNumber = cnt.MembershipNumber 
      AND c.status = cnt.status; 
1

你可以這樣來做:

select t1.* 
from card t1 left join 
    (select EmbossName 
    from card 
    where [status]='E0' 
    group by EmbossName,[status] 
having count(MembershipNumber)>1) t2 on t1.EmbossName=t2.EmbossName 
where t2.EmbossName is not null and [status]='E0' 

結果:

MembershipNumber EmbossLine status EmbossName 
--------------------------------------------------- 
4     356   E0  Mary 
4     398   E0  Mary 

樣品結果SQL Fiddle

0

你可以試試這個:

DECLARE @DataSource TABLE 
(
    [MembershipNumber] SMALLINT 
    ,[EmbossLine] SMALLINT 
    ,[status] CHAR(2) 
    ,[EmbossName] VARCHAR(8) 
); 

INSERT INTO @DataSource ([MembershipNumber], [EmbossLine], [status], [EmbossName]) 
VALUES (0009,0321,'E0','Finn') 
     ,(0009,0322,'E1','Finn') 
     ,(0004,0356,'E0','Mary') 
     ,(0004,0398,'E0','Mary') 
     ,(0004,0382,'E1','Mary'); 

SELECT [MembershipNumber] 
     ,[EmbossLine] 
     ,[status] 
     ,[EmbossName] 
FROM 
(
    SELECT * 
      ,COUNT([MembershipNumber]) OVER (PARTITION BY [EmbossName]) AS cnt1 
      ,SUM(IIF([status] = 'E0' , 1, 0)) OVER (PARTITION BY [EmbossName]) AS cnt2 
    FROM @DataSource 
) DS 
WHERE cnt1 > 1 
    AND cnt2 > 1 
    AND [status] = 'E0'; 

enter image description here

的想法是添加第二個counter,但不是COUNT功能使用SUM功能只算有[status] = 'E0'行。然後,在where子句中,我們通過兩個計數器和[status] = 'E0'進行篩選。