2010-05-11 67 views
1

我在形式的表格:如何選擇一列中可能有多個相同值但其所有第二列具有相同值的不同行?

test_name | test_result 
----------------------- 
test1  | pass 
test2  | fail 
test1  | pass 
test1  | pass 
test2  | pass 
test1  | pass 
test3  | pass 
test3  | fail 
test3  | pass 

正如你可以看到所有測試1的傳球而TEST2的和TEST3的同時擁有通行證和失敗。

是否有一條SQL語句可用於返回僅傳遞的測試的不同名稱?例如。 test1的

回答

5

您可以通過TEST_NAME組數遍數,並檢查它是否是與組中的行數相同。

SELECT test_name 
FROM table1 
GROUP BY test_name 
HAVING SUM(test_result = 'pass') = COUNT(*) 

或者,計數失敗的次數,並檢查它是零:

SELECT test_name 
FROM table1 
GROUP BY test_name 
HAVING SUM(test_result = 'fail') = 0 

結果:

test1 

測試數據:

CREATE TABLE table1 (test_name NVARCHAR(100) NOT NULL, test_result NVARCHAR(100) NOT NULL); 
INSERT INTO table1 (test_name, test_result) VALUES 
('test1', 'pass'), 
('test2', 'fail'), 
('test1', 'pass'), 
('test1', 'pass'), 
('test2', 'pass'), 
('test1', 'pass'), 
('test3', 'pass'), 
('test3', 'fail'), 
('test3', 'pass'); 
+1

我從來沒有意識到SUM()可能需要一個條件;不錯 – 2010-05-11 17:48:24

+0

吉恩謝謝馬克,那解決了我的問題。非常感激! – Martin 2010-05-12 08:44:18

0

這可能不是最簡單的方法(我傾向於濫用子查詢),但你可以這樣做:

SELECT test_name FROM tests AS a WHERE NOT EXISTS (SELECT test_name FROM tests AS b WHERE a.test_name = b.test_name AND test_result != 'pass') GROUP BY test_name; 
+0

即過度工作量。 – 2010-05-11 17:38:45

相關問題