2012-10-23 50 views
3

我有两个表。 表A包含部门清单,共有20个部门。操纵结果以显示行为列

见图像

enter image description here

表B包含每个表A中发现部门至少1列,一些含几。

见图片

enter image description here

我要的是从A & B的基本上列出每个部门,然后人谁是全职和兼职的数量创造了第三个表。例如,如果在表b中找到的部门只有全部或部分时间的数字(例如部门D),那么我希望表格显示0(零),而不是留下空白。

见图像

enter image description here

任何人都可以对这个建议?

编辑 如果没有例如其中一个部门的“兼职”,这意味着他们兼职人员数量通常为零。

回答

3

你想要一个PIVOT

select * 
from (tableb) s 
pivot (Max(staffno) for employee_class in ([Full Time],[Part Time])) p 
+0

这工作,你能解释我是如何凝聚了全职和兼职,也exmplain什么在p在最终在做什么? – JsonStatham

+0

你的意思是“合并”全部和兼职? 'p'只是pivoting的别名。 – podiluska

+1

请参阅Itzik Ben-Gan关于枢轴的优秀文章;他涵盖了许多不同的数据透视方法。 http://www.sqlmag.com/article/sql-server/pivoting-data –

0

试试这个:

select A.DEPTNAME, 
     sum(case when B.EMPLOYEE_CLASS='Full time' then B.STAFF_NO else 0) as FullTimeNo, 
     sum(case when B.EMPLOYEE_CLASS='Part time' then B.STAFF_NO else 0) as PartTimeNo, 
from TabA A 
join TabB B on A.DEPTNAME=B.DEPTNAME 
group by A.DEPTNAME 
0
SELECT 
    A.DEPTNAME, 
    (SELECT COUNT(*) FROM TABLEA A2 INNER JOIN TABLEB B ON B.TableAID = A2.TableAID WHERE B.EMPLOYEE_CLASS = 'Full time' AND A2.TableAID = A.TableAID) FullTimeNo, 
    (SELECT COUNT(*) FROM TABLEA A2 INNER JOIN TABLEB B ON B.TableAID = A2.TableAID WHERE B.EMPLOYEE_CLASS = 'Part time' AND A2.TableAID = A.TableAID) PartTimeNo 
FROM 
    TABLEA