日期:2014-05-18  浏览次数:20587 次

求一sql语句,按不同类型查询各部门的人数



上面我所说的,按岗位类型分类,查询各个部门分别有哪几种岗位类型的人员以及所属这种岗位类型人员的数量。
查询结果如下:
部门名称---管理人员(此类型包含后面的几个子项)---行政管理---经营预算---工程技术人员---技师。。
A部门------9(2+4+3)----------------------------------4----------3----------7(2+5)---------5
B部门------7(2+3+2)----------------------------------3----------2----------5(3+2)---------2  
C部门------11(3+5+3)---------------------------------5----------3----------8(3+5)---------5


工程技术人员还包含好几种类型.因为岗位类型以及子类是可以增加删除的.所以查询的时候是不可能按几种因定的类型来查询

http://topic.csdn.net/u/20120518/18/d39ac644-83ad-43ce-a947-6c2d99e22eae.html?seed=316685740&r=78613674
之前这个贴子发了,沉了...还有40分呢

------解决方案--------------------
连续聚合
------解决方案--------------------
LZ这个是个bom类似的问题。参考下面的方法。

SQL code
CREATE TABLE BOM(阀门ID VARCHAR(10),零件ID VARCHAR(10),单位用量 INT)
GO
INSERT BOM SELECT 
'a','a1', 1  UNION ALL SELECT 
'a1','a11', 1 UNION ALL SELECT 
'a' ,'a2', 1 UNION ALL SELECT 
'a2', 'a22' ,1 UNION ALL SELECT 
'b', 'b1' ,1 UNION ALL SELECT 
'b1', 'b11' ,1 UNION ALL SELECT 
'b', 'b2', 1 UNION ALL SELECT 
'b2', 'b22' ,1;
GO 
;WITH cte AS
(
    SELECT * ,path=CAST(阀门ID+'->'+零件ID AS VARCHAR(8000)),lev=1 FROM BOM WHERE patindex('%[1-9]%',阀门ID)=0
    UNION ALL
    SELECT B.*,cast(c.path+'->'+B.零件ID AS VARCHAR(8000)),LEV+1 FROM CTE C JOIN BOM B ON C.零件ID=B.阀门ID
)
SELECT LEFT(c.path,charindex('-',c.path)-1)  阀门ID,零件ID,单位用量 
FROM CTE c 
WHERE NOT EXISTS (SELECT * FROM cte WHERE  LEFT(path,charindex('-',path)-1)=LEFT(c.path,charindex('-',c.path)-1) AND LEV>c.lev)
ORDER BY 阀门ID,零件ID
/*
阀门ID 零件ID 单位用量
------ ------ --------
a      a11           1
a      a22           1
b      b11           1
b      b22           1*/
DROP TABLE bom