2012-09-28 82 views
0

我有银行的工作人员信息的表,看起来像这样:的Oracle 11g R2 SQL行列

branchNumber Position firstName lastName staffNumber 
------------ -------- --------- -------- ----------- 
25    Manager  john   doe   11111 
25    Secretary robert  paulson  11112 
25    Secretary cindy  lu   11113 
66    Manager  tim   timson  22223 
66    Manager  jacob  jacobson 22224 
66    Secretary henry  henryson 22225 
66    Supervisor paul   paulerton 22226 

其实我这个做,但我使用SQL公共表表达式完成了任务,我不能在这个项目中使用它们,我需要这种格式。

branchNumber numOfManagers numOfSecretaries numOfSupervisors totalEmployees 
------------ ------------- ---------------- ---------------- -------------- 
25     1     2     0     3 
66     2     1     1     4 

我的问题是从行掌握信息多列,我有这个迄今为止,

SELECT branchNumber, COUNT(*) AS numOfManagers 
FROM Staff 
WHERE position = 'Manager' 
GROUP BY branchNumber, Position; 

此输出用于numOfManagers正确的信息,而使得接下来的三列我摸不透,而无需使用CTE的。我也尝试了子选择,没有运气。任何人有任何想法?

回答

6

您可以使用这样的事情:

select branchnumber, 
    sum(case when Position ='Manager' then 1 else 0 end) numofManagers, 
    sum(case when Position ='Secretary' then 1 else 0 end) numofSecretaries, 
    sum(case when Position ='Supervisor' then 1 else 0 end) numofSupervisors, 
    count(*) totalEmployees 
from yourtable 
group by branchnumber 

SQL Fiddle with Demo

或者你可以使用PIVOT功能:

select branchnumber, 
    'Manager', 'Secretary', 'Supervisor', 
    TotalEmployees 
from 
(
    select t1.branchnumber, 
    t1.position, 
    t2.TotalEmployees 
    from yourtable t1 
    inner join 
    (
    select branchnumber, count(*) TotalEmployees 
    from yourtable 
    group by branchnumber 
) t2 
    on t1.branchnumber = t2.branchnumber 
) x 
pivot 
(
    count(position) 
    for position in ('Manager', 'Secretary', 'Supervisor') 
) p; 

SQL Fiddle with Demo

+0

非常好,非常感谢你很多时候,“情况下”部分正是我所看到的为,并且非常直观。感谢您的帮助,而且PIVOT也非常有用。 – trueCamelType