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

sql数据统计问题
有字段表tableA,格式如下:

项目名称 员工名称 调入时间 调出时间

A 张三 2012-4-1 2012-4-3
B 李四 2012-3-25 
C 张三 2012-4-6 2012-4-9
D 王五 2012-4-2  
A 张三 2012-4-10 2012-4-13

调出时间为空的代表现在还在这个项目上工作;

现在要用一条sql语句求出:
张三 一共在项目上花了多少天?

张三 在A项目上花了多少天?



------解决方案--------------------
SQL code

create table tb
(
  项目名称 varchar(1),
  员工名称 nvarchar(3),
  调入时间 datetime,
  调出时间 datetime
)

insert into tb
 
select 'A','张三','2012-4-1', '2012-4-3' union all
select 'B','李四','2012-3-25', null  union all
select 'C','张三','2012-4-6', '2012-4-9'  union all
select 'D','王五','2012-4-2',null  union all
select 'A','张三','2012-4-10', '2012-4-13'


select 员工名称,项目名称,SUM(DATEDIFF(DAY,调入时间,调出时间)) AS 时间 from tb group by 员工名称,项目名称

------解决方案--------------------
SQL code

--> 测试数据:[tbl]
if object_id('[tbl]') is not null drop table [tbl]
create table [tbl](
[项目名称] varchar(1),
[员工名称] varchar(4),
[调入时间] date,
[调出时间] date
)
insert [tbl]
select 'A','张三','2012-4-1','2012-4-3' union all
select 'B','李四','2012-3-25',null union all
select 'C','张三','2012-4-6','2012-4-9' union all
select 'D','王五','2012-4-2',null union all
select 'A','张三','2012-4-10','2012-4-13'

select [项目名称],[员工名称],
SUM(DATEDIFF(dd,[调入时间],[调出时间])) as 总天数 
from tbl where [员工名称]='张三'
group by [员工名称]
/*
员工名称    总天数
张三    8
*/
select [员工名称],[项目名称],
SUM(DATEDIFF(dd,[调入时间],[调出时间])) as 总天数 
from tbl where [员工名称]='张三'
group by [员工名称],[项目名称]
/*
员工名称    项目名称    总天数
张三    A    5
张三    C    3
*/

------解决方案--------------------
SQL code

create table tb
(
  项目名称 varchar(1),
  员工名称 nvarchar(3),
  调入时间 datetime,
  调出时间 datetime
)

insert into tb
 
select 'A','张三','2012-4-1', '2012-4-3' union all
select 'B','李四','2012-3-25', null  union all
select 'C','张三','2012-4-6', '2012-4-9'  union all
select 'D','王五','2012-4-2',null  union all
select 'A','张三','2012-4-10', '2012-4-13'


select 员工名称,项目名称,SUM(DATEDIFF(DAY,调入时间,调出时间)) AS 时间 
from tb 
where 员工名称='张三' and 项目名称='A'
group by 员工名称,项目名称

------解决方案--------------------
SQL code

CREATE TABLE DEMO (项目名称 VARCHAR(100),员工名称 VARCHAR(100),调入时间 DATETIME,调出时间 DATETIME)

INSERT INTO DEMO
SELECT 'A','张三','2012-4-1','2012-4-3'
UNION ALL
SELECT 'B','李四','2012-3-25',NULL
UNION ALL
SELECT 'C','张三','2012-4-6','2012-4-9'
UNION ALL
SELECT 'D','王五','2012-4-2',NULL 
UNION ALL
SELECT 'A','张三','2012-4-10','2012-4-13'


SELECT 员工名称,SUM(DATEDIFF(DAY,调入时间,ISNULL(调出时间,GETDATE()))+1)
FROM DEMO
GROUP BY 员工名称
ORDER BY 员工名称

SELECT 员工名称,项目名称,SUM(DATEDIFF(DAY,调入时间,ISNULL(调出时间,GETDATE()))+1)
FROM DEMO
GROUP BY 员工名称,项目名称
ORDER BY 员工名称,项目名称


DROP TABLE DEMO