2012-08-22 180 views
0

我有这个简单的(不实用)表SQL Server查询

STUDENTID SERVICE 
1   a   
1   b   
1   c   
1   d   
1   e   
2   a   
2   b   
2   c   
2   d   
2   e   
3   a   
3   b   
3   c   
4   a   
4   f   
5   a   
5   d   
6   f   
6   g   
7   a   
7   b   
7   c   
7   d   
7   e   
8   a   
8   b   
8   c   
8   d   
8   e  

我想制表例如某些信息。

有多少学生已经注册了服务'a'和服务'b'。
有多少学生已经注册了服务'a'和服务'c'。
有多少学生已经注册了服务'a'和服务'd'。等

多少学生已经签署了服务“一”,比“一”另一个其他服务。
有多少学生注册了服务'b'和除'b'以外的其他两个服务。

未来的服务数量可能会发生变化,但现在没关系。

这就是我现在所拥有的,它不工作。

--want返回任何其他服务谁已经签署了一个学生的数量和1

select COUNT(STUDENTID), service from table 
group by service where service = 'a' and studentid in 
(select studentid from table group by STUDENTID having COUNT(service) = 2) 
+0

你问的问题是什么? –

+0

根据表格 - 有多少学生注册了服务“a”和除“a”以外的其他服务。或 有多少学生注册了服务'b'和除'b'以外的其他两个服务。 – Marin

回答

2

以下是关于您的问题的一些提示。

有多少学生已经注册了服务'a'和服务'b'。

SELECT COUNT(*) 
FROM 
(
    SELECT studentID 
    FROM tableName 
    WHERE Service IN ('A', 'B') 
    GROUP BY StudentID 
    HAVING COUNT(studentID) = 2 
) a 

多少学生已经签署了服务 'a' 和服务 'C' 孤单。

SELECT COUNT(*) 
FROM 
(
    SELECT studentID 
    FROM tableName 
    WHERE Service IN ('A', 'C') 
    GROUP BY StudentID 
    HAVING COUNT(studentID) = 2 
) a 
+0

@Marin。 。 。这是回答您的问题的正确方法。使用HAVING子句来定义各个组中要使用的特征。 –

+0

这一个工作表示感谢。关于“有多少学生注册了服务'b'以及'b'以外的其他两个服务'”。这与此类似吗?谢谢 – Marin

0

什么:

select COUNT(t.STUDENTID) 
from 
(select studentid, service from table group by STUDENTID having COUNT(service) = 2) as t 
WHERE t.service = 'a' 
+0

嗨丹,由于某种原因,它会在哪里引发错误。它执行AS,ID或quoted_ID。谢谢。 – Marin

+0

可能想要FROM(Sele ...)被别名...请参阅编辑 – Dan

0

您可以自行加入

SELECT COUNT(DISTINCT studentid) n 
FROM  table t1 
LEFT JOIN table t2 on (t1.studentid = t2.studentid) 
WHERE t1.service = 'a' AND t2.service <> 'a' 

或如果你想知道学生...

SELECT studentid, SUM(IF(service = 'a',1,0)) n_a, SUM(IF(service = 'a',0,1)) n_other 
FROM table 
GROUP BY studentid 
HAVING n_a = 1 AND n_other >= 1 
+0

您好Matt,感谢您的输入。当我尝试运行它时,我得到模棱两可的列studentid(第一行)... – Marin

+0

我添加了t1.studentid谢谢 – Marin