2017-03-04 60 views
0

我有一個表 原始數據就像SQL集團擁有不超過2個不同的特定值

RollNumber | Subject | G   | Part | Status 
------------------------------------------------ 
1   | 1  | 1   | 1 | 1 
1   | 1  | 1   | 2 | 1 
1   | 2  | 1   | 1 | 1 
1   | 2  | 1   | 2 | 5 
1   | 3  | 1   | 1 | 1 
1   | 3  | 1   | 2 | 1 
2   | 1  | 2   | 1 | 1 
2   | 1  | 2   | 2 | 1 
2   | 2  | 2   | 1 | 1 
2   | 2  | 2   | 2 | 1 
2   | 3  | 2   | 1 | 1 
2   | 3  | 2   | 2 | 1 
3   | 1  | 2   | 1 | 1 
3   | 1  | 2   | 2 | 1 
3   | 2  | 2   | 1 | 1 
3   | 2  | 2   | 2 | 1 
3   | 3  | 2   | 1 | 0 
3   | 3  | 2   | 2 | 1 
4   | 1  | 2   | 1 | 1 
4   | 1  | 2   | 2 | 1 
4   | 2  | 2   | 1 | 1 
4   | 2  | 2   | 2 | 1 
4   | 3  | 2   | 1 | 3 
4   | 3  | 2   | 2 | 1 

我想裏面應該有不同的狀態1和3 我需要的數據全部RollNumber的數據是這樣的:

RollNumber | Subject | G   | Part | Status 
------------------------------------------------ 
4   | 1  | 2   | 1 | 1 
4   | 1  | 2   | 2 | 1 
4   | 2  | 2   | 1 | 1 
4   | 2  | 2   | 2 | 1 
4   | 3  | 2   | 1 | 3 
4   | 3  | 2   | 2 | 1 

我需要查詢其適用於在MySQL

+0

mysql或sql-server? – scaisEdge

+0

@scaisEdge – Brainiac

回答

3

您可以使用聚集地發現,甲肝的rollnumbers也像所有SQL e 1,3都作爲子查詢中的狀態,並用它來獲取所有相關的行。

IN使用:

select * 
from t 
where rollnumber in (
     select rollnumber 
     from t 
     where status in (1, 3) 
     group by rollnumber 
     having count(distinct status) = 2 
     ); 

使用JOIN

select t1.* 
from t t1 
join (
    select rollnumber 
    from t 
    where status in (1, 3) 
    group by rollnumber 
    having count(distinct status) = 2 
    ) t2 on t1.rollnumber = t2.rollnumber; 

子查詢過濾器來保持僅與狀態1或3中的行使用where子句。然後,當在rollNumber上分組時,我們檢查不同的狀態計數是否爲2,這意味着1和3都存在於該rollNumber中。

+0

MySQL上的'join'可能更好。 –

0
Use HAVING and GROUP BY clause to get rollnumber having status 1 and 3 and finally join to get result. 

CREATE TABLE #table(RollNumber INT, Subject INT, G INT,Part INT, Status INT) 
INSERT INTO #table(RollNumber , Subject , G ,Part , Status) 
SELECT 1   , 1  , 1   , 1 , 1 UNION ALL 
SELECT 1   , 1  , 1   , 2 , 1 UNION ALL 
SELECT 1   , 2  , 1   , 1 , 1 UNION ALL 
SELECT 1   , 2  , 1   , 2 , 5 UNION ALL 
SELECT 1   , 3  , 1   , 1 , 1 UNION ALL 
SELECT 1   , 3  , 1   , 2 , 1 UNION ALL 
SELECT 2   , 1  , 2   , 1 , 1 UNION ALL 
SELECT 2   , 1  , 2   , 2 , 1 UNION ALL 
SELECT 2   , 2  , 2   , 1 , 1 UNION ALL 
SELECT 2   , 2  , 2   , 2 , 1 UNION ALL 
SELECT 2   , 3  , 2   , 1 , 1 UNION ALL 
SELECT 2   , 3  , 2   , 2 , 1 UNION ALL 
SELECT 3   , 1  , 2   , 1 , 1 UNION ALL 
SELECT 3   , 1  , 2   , 2 , 1 UNION ALL 
SELECT 3   , 2  , 2   , 1 , 1 UNION ALL 
SELECT 3   , 2  , 2   , 2 , 1 UNION ALL 
SELECT 3   , 3  , 2   , 1 , 0 UNION ALL 
SELECT 3   , 3  , 2   , 2 , 1 UNION ALL 
SELECT 4   , 1  , 2   , 1 , 1 UNION ALL 
SELECT 4   , 1  , 2   , 2 , 1 UNION ALL 
SELECT 4   , 2  , 2   , 1 , 1 UNION ALL 
SELECT 4   , 2  , 2   , 2 , 1 UNION ALL 
SELECT 4   , 3  , 2   , 1 , 3 UNION ALL 
SELECT 4   , 3  , 2   , 2 , 1 

SELECT * 
FROM #table T 
JOIN 
(
    SELECT RollNumber 
    FROM #table 
    WHERE Status IN (1,3) 
    GROUP BY RollNumber 
    HAVING COUNT (DISTINCT Status) = 2 
)A ON A.RollNumber = T.RollNumber