select og.Id as 组织ID,og.OrgName as组织名,Og.ParentId as 上级组织,
empSum.EmployeeSum as 总人数,empSum.MaleSum as 男性人数,empSum.FemaleSum as 女性人数
from Orgnazation og left join (select empCTE.Depart as OrgId,COUNT(*) as EmployeeSum
,SUM(case when empCTE.Sex='男' then 1 else 0 end) as MaleSum,
SUM(case when empCTE.Sex='女' then 1 else 0 end) as FemaleSum
from empCTE
left join Orgnazation oo on oo.Id=empCTE.Depart group by empCTE.Depart) empSum on
og.Id=empSum.OrgId
请大神们指点迷津,告诉我怎么改这段SQL或者给提供个能正确统计的SQL,感激不尽。
;WITH cte AS (
Select Orgnazation.ID,Orgnazation.ID AS OID,Orgnazation.ParentId AS Pid,OrgName AS Name from Orgnazation
UNION ALL
SELECT Orgnazation.ID,OID,cte.Pid,cte.Name FROM dbo.Orgnazation JOIN cte ON cte.ID = Orgnazation.ParentId
)
SELECT
cte.OID,
cte.Name,
cte.Pid,
COUNT(1) AS 总人数,
SUM( CASE
WHEN Sex = '男'
THEN 1
ELSE
0
END
) AS 男性人数,
SUM( CASE
WHEN Sex = '女'
THEN 1
ELSE
0
END
) AS 女性人数
FROM
cte
JOIN
Employee
ON cte.Id = Depart
WHERE IDate >='1990-01-01' AND [Odate] <= '1999-01-01' --这里加上条件就行了
GROUP BY
cte.OID,
cte.Name,
cte.Pid
;WITH cte AS (
Select Orgnazation.ID,Orgnazation.ID AS OID,Orgnazation.ParentId AS Pid,OrgName AS Name from Orgnazation
UNION ALL
SELECT Orgnazation.ID,OID,cte.Pid,cte.Name FROM dbo.Orgnazation JOIN cte ON cte.ID = Orgnazation.ParentId
)
SELECT
cte.OID,
cte.Name,
cte.Pid,
COUNT(1) AS 总人数,
SUM( CASE
WHEN Sex = '男'
THEN 1
ELSE
0
END
) AS 男性人数,
SUM( CASE
WHEN Sex = '女'
THEN 1
ELSE
0
END
) AS 女性人数
FROM
cte
JOIN
Employee
ON cte.Id = Depart
WHERE IDate >='1990-01-01' AND [Odate] <= '1999-01-01' --这里加上条件就行了
GROUP BY
cte.OID,
cte.Name,
cte.Pid
;WITH cte AS (
Select Orgnazation.ID,Orgnazation.ID AS OID,Orgnazation.ParentId AS Pid,OrgName AS Name from Orgnazation
UNION ALL
SELECT Orgnazation.ID,OID,cte.Pid,cte.Name FROM dbo.Orgnazation JOIN cte ON cte.ID = Orgnazation.ParentId
)
SELECT
cte.OID,
cte.Name,
cte.Pid,
COUNT(1) AS 总人数,
SUM( CASE
WHEN Sex = '男'
THEN 1
ELSE
0
END
) AS 男性人数,
SUM( CASE
WHEN Sex = '女'
THEN 1
ELSE
0
END
) AS 女性人数
FROM
cte
JOIN
Employee
ON cte.Id = Depart
WHERE IDate >='1990-01-01' AND [Odate] <= '1999-01-01' --这里加上条件就行了
GROUP BY
cte.OID,
cte.Name,
cte.Pid
;WITH cte AS (
Select Orgnazation.ID,Orgnazation.ID AS OID,Orgnazation.ParentId AS Pid,OrgName AS Name from Orgnazation
UNION ALL
SELECT Orgnazation.ID,OID,cte.Pid,cte.Name FROM dbo.Orgnazation JOIN cte ON cte.ID = Orgnazation.ParentId
)
SELECT
cte.OID,
cte.Name,
cte.Pid,
COUNT(1) AS 总人数,
SUM( CASE
WHEN Sex = '男'
THEN 1
ELSE
0
END
) AS 男性人数,
SUM( CASE
WHEN Sex = '女'
THEN 1
ELSE
0
END
) AS 女性人数
FROM
cte
JOIN
Employee
ON cte.Id = Depart
WHERE IDate >='1990-01-01' AND [Odate] <= '1999-01-01' --这里加上条件就行了
GROUP BY
cte.OID,
cte.Name,
cte.Pid
--测试数据
if not object_id(N'Employee') is null
drop table Employee
Go
Create table Employee([EId] nvarchar(23),[Name] nvarchar(23),[Sex] nvarchar(21),[Depart] int)
Insert Employee
select N'001',N'臧三',N'男',103 union all
select N'002',N'雄起',N'男',103 union all
select N'003',N'冠益乳',N'女',103 union all
select N'004',N'但是',N'男',104 union all
select N'005',N'热风',N'男',104 union all
select N'006',N'裤脚',N'男',105 union all
select N'007',N'是多少',N'女',105 union all
select N'008',N'出纳',N'女',106 union all
select N'009',N'删除',N'男',107 union all
select N'010',N'但是',N'男',107
GO
if not object_id(N'Orgnazation') is null
drop table Orgnazation
Go
Create table Orgnazation([Id] int,[OrgName] nvarchar(24),[ParentId] int)
Insert Orgnazation
select 100,N'M公司',null union all
select 101,N'管理中心',100 union all
select 102,N'业务中心',100 union all
select 103,N'财务部',100 union all
select 104,N'人事部',101 union all
select 105,N'技术部',101 union all
select 106,N'销售1部',102 union all
select 107,N'销售2部',102
Go
--测试数据结束
;WITH cte AS (
Select Orgnazation.ID,Orgnazation.ID AS OID,Orgnazation.ParentId AS Pid,OrgName AS Name from Orgnazation
UNION ALL
SELECT Orgnazation.ID,OID,cte.Pid,cte.Name FROM dbo.Orgnazation JOIN cte ON cte.ID = Orgnazation.ParentId
)
SELECT
cte.OID,
cte.Name,
cte.Pid,
COUNT(1) AS 总人数,
SUM( CASE
WHEN Sex = '男'
THEN 1
ELSE
0
END
) AS 男性人数,
SUM( CASE
WHEN Sex = '女'
THEN 1
ELSE
0
END
) AS 女性人数
FROM
cte
JOIN
Employee
ON cte.Id = Depart
GROUP BY
cte.OID,
cte.Name,
cte.Pid
大神,这样得到的数据是对的,但是,我现实的情况还要考虑Employee入职和离职时间问题(Employee表上有入职时间和离职时间字段),要那种输入开始月份,结束月份得到期间每个月的统计列表那种,我把你给的代码放进存储过程,统计出来的结果是错误的。
Employee表测试数据如下:
--测试数据
if not object_id(N'Employee') is null
drop table Employee
Go
Create table Employee([EId] nvarchar(23),[Name] nvarchar(23),[Sex] nvarchar(21),[Depart] int,[Idate] date,[Odate] date)
Insert Employee
select N'001',N'臧三',N'男',103,'1998-01-01','2000-03-01' union all
select N'002',N'雄起',N'男',103,'1999-04-01','2000-04-01' union all
select N'003',N'冠益乳',N'女',103,'1997-10-01',NULL union all
select N'004',N'但是',N'男',104,'2000-01-01',NULl union all
select N'005',N'热风',N'男',104,'1990-03-01','1998-05-01' union all
select N'006',N'裤脚',N'男',105,'1995-03-01',NULl union all
select N'007',N'是多少',N'女',105,'1997-05-01','1999-11-01' union all
select N'008',N'出纳',N'女',106,'1994-05-01','2001-09-01' union all
select N'009',N'删除',N'男',107,'1996-03-01','1999-06-01' union all
select N'010',N'但是',N'男',107,'1999-11-01',NULL
GO
存储过程现在的代码如下:
ALTER PROCEDURE [dbo].[Pro_Test4]
@start char(7)='', --查询开始月份
@end char(7)='', --查询结束月份
@dep int=0 --查询组织
AS
BEGIN
create table #Result(ym char(7),org varchar(50),total int,malecount int,femalecount int)
while(@start<=@end)
begin
--统计月份在职员工
select qq.EId,qq.Depart,qq.Idate,qq.Odate,qq.Sex into #emp from Employee qq
inner join Employee ttt on ttt.EId=qq.EId and ttt.Idate <DATEADD(MM,1,@start+'-01')
where qq.Odate>=DATEADD(MM,1,@start+'-01') or qq.Odate is null;
WITH cte AS (
Select Orgnazation.ID,Orgnazation.ID AS OID,Orgnazation.ParentId AS Pid,OrgName AS Name from Orgnazation
UNION ALL
SELECT Orgnazation.ID,OID,cte.Pid,cte.Name FROM dbo.Orgnazation JOIN cte ON cte.ID = Orgnazation.ParentId
)
SELECT
@start as Ym,
cte.OID,
cte.Name,
cte.Pid,
COUNT(1) AS 总人数,
SUM( CASE
WHEN Sex = '男'
THEN 1
ELSE
0
END
) AS 男性人数,
SUM( CASE
WHEN Sex = '女'
THEN 1
ELSE
0
END
) AS 女性人数 into #ttt
FROM
cte
right JOIN
#emp
ON cte.Id = #emp.Depart
where cte.OID=@dep
GROUP BY
cte.OID,
cte.Name,
cte.Pid
OPTION(MAXRECURSION 10)
insert into #Result select v.Ym,v.Name,v.总人数,v.男性人数,v.女性人数 from #ttt v
set @start=CONVERT(char(7),DATEADD(mm,1,@start+'-01'),120)
大神,这样得到的数据是对的,但是,我现实的情况还要考虑Employee入职和离职时间问题(Employee表上有入职时间和离职时间字段),要那种输入开始月份,结束月份得到期间每个月的统计列表那种,我把你给的代码放进存储过程,统计出来的结果是错误的。
Employee表测试数据如下:
--测试数据
if not object_id(N'Employee') is null
drop table Employee
Go
Create table Employee([EId] nvarchar(23),[Name] nvarchar(23),[Sex] nvarchar(21),[Depart] int,[Idate] date,[Odate] date)
Insert Employee
select N'001',N'臧三',N'男',103,'1998-01-01','2000-03-01' union all
select N'002',N'雄起',N'男',103,'1999-04-01','2000-04-01' union all
select N'003',N'冠益乳',N'女',103,'1997-10-01',NULL union all
select N'004',N'但是',N'男',104,'2000-01-01',NULl union all
select N'005',N'热风',N'男',104,'1990-03-01','1998-05-01' union all
select N'006',N'裤脚',N'男',105,'1995-03-01',NULl union all
select N'007',N'是多少',N'女',105,'1997-05-01','1999-11-01' union all
select N'008',N'出纳',N'女',106,'1994-05-01','2001-09-01' union all
select N'009',N'删除',N'男',107,'1996-03-01','1999-06-01' union all
select N'010',N'但是',N'男',107,'1999-11-01',NULL
GO
存储过程现在的代码如下:
ALTER PROCEDURE [dbo].[Pro_Test4]
@start char(7)='', --查询开始月份
@end char(7)='', --查询结束月份
@dep int=0 --查询组织
AS
BEGIN
create table #Result(ym char(7),org varchar(50),total int,malecount int,femalecount int)
while(@start<=@end)
begin
--统计月份在职员工
select qq.EId,qq.Depart,qq.Idate,qq.Odate,qq.Sex into #emp from Employee qq
inner join Employee ttt on ttt.EId=qq.EId and ttt.Idate <DATEADD(MM,1,@start+'-01')
where qq.Odate>=DATEADD(MM,1,@start+'-01') or qq.Odate is null;
WITH cte AS (
Select Orgnazation.ID,Orgnazation.ID AS OID,Orgnazation.ParentId AS Pid,OrgName AS Name from Orgnazation
UNION ALL
SELECT Orgnazation.ID,OID,cte.Pid,cte.Name FROM dbo.Orgnazation JOIN cte ON cte.ID = Orgnazation.ParentId
)
SELECT
@start as Ym,
cte.OID,
cte.Name,
cte.Pid,
COUNT(1) AS 总人数,
SUM( CASE
WHEN Sex = '男'
THEN 1
ELSE
0
END
) AS 男性人数,
SUM( CASE
WHEN Sex = '女'
THEN 1
ELSE
0
END
) AS 女性人数 into #ttt
FROM
cte
right JOIN
#emp
ON cte.Id = #emp.Depart
where cte.OID=@dep
GROUP BY
cte.OID,
cte.Name,
cte.Pid
OPTION(MAXRECURSION 10)
insert into #Result select v.Ym,v.Name,v.总人数,v.男性人数,v.女性人数 from #ttt v
set @start=CONVERT(char(7),DATEADD(mm,1,@start+'-01'),120)
--测试数据
if not object_id(N'Employee') is null
drop table Employee
Go
Create table Employee([EId] nvarchar(23),[Name] nvarchar(23),[Sex] nvarchar(21),[Depart] int,[Idate] date,[Odate] date)
Insert Employee
select N'001',N'臧三',N'男',103,'1998-01-01','2000-03-01' union all
select N'002',N'雄起',N'男',103,'1999-04-01','2000-04-01' union all
select N'003',N'冠益乳',N'女',103,'1997-10-01',NULL union all
select N'004',N'但是',N'男',104,'2000-01-01',NULl union all
select N'005',N'热风',N'男',104,'1990-03-01','1998-05-01' union all
select N'006',N'裤脚',N'男',105,'1995-03-01',NULl union all
select N'007',N'是多少',N'女',105,'1997-05-01','1999-11-01' union all
select N'008',N'出纳',N'女',106,'1994-05-01','2001-09-01' union all
select N'009',N'删除',N'男',107,'1996-03-01','1999-06-01' union all
select N'010',N'但是',N'男',107,'1999-11-01',NULL
GO
if not object_id(N'Orgnazation') is null
drop table Orgnazation
Go
Create table Orgnazation([Id] int,[OrgName] nvarchar(24),[ParentId] int)
Insert Orgnazation
select 100,N'M公司',null union all
select 101,N'管理中心',100 union all
select 102,N'业务中心',100 union all
select 103,N'财务部',100 union all
select 104,N'人事部',101 union all
select 105,N'技术部',101 union all
select 106,N'销售1部',102 union all
select 107,N'销售2部',102
Go
--测试数据结束
;WITH ctea AS (
SELECT
DATEADD(MONTH, number, CONVERT(DATETIME, '1998-01-01')) AS ym,Id,OrgName,[ParentId]
FROM
master..spt_values ,Orgnazation
WHERE number BETWEEN 0 AND DATEDIFF(MONTH, '1998-01-01', DATEADD(MONTH, 1, '1998-12-01'))-1 AND type='P'
),cteb AS (
SELECT * FROM ctea LEFT JOIN dbo.Employee ON Depart=ctea.Id AND ctea.ym BETWEEN Idate AND ISNULL(Odate,GETDATE())
),ctec AS (
SELECT ym,id AS Orgid,cteb.OrgName,cteb.Sex,id AS lid FROM cteb
UNION ALL
SELECT ctec.ym,ctec.Orgid,ctec.OrgName,cteb.Sex,cteb.Id FROM cteb JOIN ctec ON cteb.ParentId = ctec.lid AND ctec.ym = cteb.ym
)
SELECT
ctec.ym,
ctec.Orgid,
ctec.OrgName,
SUM( CASE
WHEN Sex IS NOT NULL
THEN 1
ELSE
0
END
) AS 总人数,
SUM( CASE
WHEN Sex = '男'
THEN 1
ELSE
0
END
) AS 男性人数,
SUM( CASE
WHEN Sex = '女'
THEN 1
ELSE
0
END
) AS 女性人数
FROM
ctec
GROUP BY
ctec.ym,
ctec.Orgid,
ctec.OrgName
ORDER BY ym OPTION(MAXRECURSION 0)
--测试数据
if not object_id(N'Employee') is null
drop table Employee
Go
Create table Employee([EId] nvarchar(23),[Name] nvarchar(23),[Sex] nvarchar(21),[Depart] int)
Insert Employee
select N'001',N'臧三',N'男',103 union all
select N'002',N'雄起',N'男',103 union all
select N'003',N'冠益乳',N'女',103 union all
select N'004',N'但是',N'男',104 union all
select N'005',N'热风',N'男',104 union all
select N'006',N'裤脚',N'男',105 union all
select N'007',N'是多少',N'女',105 union all
select N'008',N'出纳',N'女',106 union all
select N'009',N'删除',N'男',107 union all
select N'010',N'但是',N'男',107
GO
if not object_id(N'Orgnazation') is null
drop table Orgnazation
Go
Create table Orgnazation([Id] int,[OrgName] nvarchar(24),[ParentId] int)
Insert Orgnazation
select 100,N'M公司',null union all
select 101,N'管理中心',100 union all
select 102,N'业务中心',100 union all
select 103,N'财务部',100 union all
select 104,N'人事部',101 union all
select 105,N'技术部',101 union all
select 106,N'销售1部',102 union all
select 107,N'销售2部',102
Go
--测试数据结束
;WITH cte AS (
Select Orgnazation.ID,Orgnazation.ID AS OID,Orgnazation.ParentId AS Pid,OrgName AS Name from Orgnazation
UNION ALL
SELECT Orgnazation.ID,OID,cte.Pid,cte.Name FROM dbo.Orgnazation JOIN cte ON cte.ID = Orgnazation.ParentId
)
SELECT
cte.OID,
cte.Name,
cte.Pid,
COUNT(1) AS 总人数,
SUM( CASE
WHEN Sex = '男'
THEN 1
ELSE
0
END
) AS 男性人数,
SUM( CASE
WHEN Sex = '女'
THEN 1
ELSE
0
END
) AS 女性人数
FROM
cte
JOIN
Employee
ON cte.Id = Depart
GROUP BY
cte.OID,
cte.Name,
cte.Pid