计算一个表中行/列的组合

时间:2013-05-20 20:47:38

标签: sql select group-by

我有一个问题,我无法绕过头脑。我正在尝试做的是提出一个报告,其中包含主要(会计,商业等)的行,其中包含注册类型(已注册,撤回等)的列,每个列都有计数。现在,这是我的问题。

SELECT datatel_academicprogramofinterestidname, datatel_prospectstatusname
FROM FilteredContact
GROUP BY datatel_academicprogramofinterestidname, datatel_prospectstatusname

这给了我表格中这两个字段的每个组合。我想获得要显示的每个组合的计数。行将是interestidname字段,列将是prospectstatusname字段。在每个单元格中,将计算该特定组合中的多少(例如,会计/登记)

我尝试过多种方式,但似乎无法按照我想要的方式打破列。不知道如何使用group by,count和my where子句来使它按照我想要的格式化。好消息是我的所有信息都放在一张桌子上,我只是无法让它看起来像我想要的那样。

|Accounting (BS)                             | Accepted | 25|   
|Acting (BFA)                                | Accepted | 32|    
|Advertising & Marketing Communications (BA) | Accepted | 29|  
|American Studies (BA)                       | Accepted |  2|    
|Accounting (BS)                             | Enrolled |  5|    
|Acting (BFA)                                | Enrolled | 17|    
|Advertising & Marketing Communications (BA) | Enrolled | 40|  
|American Studies (BA)                       | Enrolled | 10|    

2 个答案:

答案 0 :(得分:0)

您可以在此处使用数据透视表。我创建了一个 SQL Fiddle 来配合这个。假设您的主键字段名称是p_id

SELECT *
FROM FilteredContact 
PIVOT ( count(p_id)
        for datatel_prospectstatusname IN ([Accepted], [Enrolled])
      ) as p

答案 1 :(得分:0)

您可以使用带有CASE表达式的聚合函数轻松地将数据行转换为列:

select interestidname, 
  sum(case when datatel_prospectstatusname = 'Enrolled' then 1 else 0 end) Enrolled,
  sum(case when datatel_prospectstatusname = 'Accepted' then 1 else 0 end) Accepted
from FilteredContact
group by interestidname
相关问题