2017-10-05 91 views
0

對於表t1基於組返回ID值

+----+------+ 
| ID | Flag | 
+----+------+ 
| 1 | 1 | 
| 1 | 0 | 
| 1 | 0 | 
| 2 | 0 | 
| 2 | 0 | 
| 2 | 0 | 
| 3 | 1 | 
| 3 | 1 | 
| 3 | 0 | 
+----+------+ 

我需要提取的樣本子集ID的基礎上以兩種不同方式的標誌值:

1)所有的ID沒有1的中旗。

+----+ 
    | ID | 
    +----+ 
    | 2 | 
    +----+ 

2)所有ID在Flag中有多個1。

+----+ 
    | ID | 
    +----+ 
    | 3 | 
    +----+ 

嘗試查詢不是有用因此排除實現,這是使用的情況下的聚集

回答

1

的一個簡單方法。例如:

DECLARE @T TABLE (ID INT, Flag BIT); 
INSERT @T VALUES (1, 1), (1, 0), (1, 0), (2, 0), (2, 0), (2, 0), (3, 1), (3, 1), (3, 0); 

SELECT ID 
FROM @T 
GROUP BY ID 
HAVING COUNT(CASE WHEN Flag = 1 THEN 1 END) = 0; -- No flag 1. 

SELECT ID 
FROM @T 
GROUP BY ID 
HAVING COUNT(CASE WHEN Flag = 1 THEN 1 END) > 1; -- More than one flag 1. 
0

使用以下查詢檢查標誌計數總數。

1)

SELECT id, 
     SUM(flag) cnt 
    FROM t1 
GROUP BY id 
HAVING SUM(flag) = 0 

結果

id cnt 
2 0 

2)

SELECT id, 
     SUM(flag) cnt 
    FROM t1 
GROUP BY id 
HAVING SUM(flag) > 1 

結果

id cnt 
3 2 
+1

請。對於求和操作符,操作數數據類型位查詢操作無效。 –

+0

是位數據類型嗎? –

+0

就是這樣。感謝您指出了這一點。很高興知道這一點不能總結。 CAST爲int將使這個工作。 – AS91

1

這是一個代碼特例位,由於標誌爲數字和一個1或0

SELECT ID, 
    CASE 
     WHEN Ones = 0 
      Then 'No active flags' 
     When Ones > 1 
      Then 'Multiple Active flags' 
    END 
FROM (
    SELECT ID, 
     Sum(Cast(Flag as int)) as Ones 
    FROM t1 
    GROUP BY ID 
    ) as Src 
WHERE Ones != 1 
0

只要你的標誌是數字和只有1和0值,那麼你可以使用下面的兩個查詢:

select ID from t1 group by ID having sum(cast(flag as int)) = 0; 

select ID from t1 group by ID having sum(cast(flag as int)) > 1; 
+0

。對於求和操作符,操作數數據類型位查詢操作無效。 –

+0

將標誌簡單轉換爲int將修復該問題。我沒有指定「只要你的標誌是數字的」一點數據類型不是真正的數字它是一個邏輯數據類型。數字數據類型可與傳統的數字操作一起使用,例如添加和擴展集合(如SUM)。 – Sentinel