请细心的高手帮一个忙,涉及到4个表,汇总查询!!分数不够再加!!!!!!!!!!!!
表1(duty)
工号 初始日期 旷工时数
001 05-01-01 0
001 05-01-02 1
002 05-01-01 0
002 05-01-02 0
003 05-01-01 0
表2 (employee)
工号 姓名 部门代号
001 张三 b1
002 李4 b1
003 王5 b2
表3 (department)
部门代号 部门名称
b1 管理部
b2 MIS
表4( holidays)---请假表
工号 日期 请假时数 双休日请假(bit) 年休假(bit)
001 05-01-01 2 0 0 '双休日和年休假为0时为'日常请假'
002 05-01-02 2 1 0
我想要的结果是:
工号 姓名 部门名称 记录数 旷工时数 日常请假汇总 双休日请假 年休假
001 张三 管理部 2 1 2 0 0
002 李4 管理部 2 0 0 2 0
003 王5 MIS 1 0 0 0 0
各位高手请帮忙呀!!!急呀!!!!!!!!
问题点数:35、回复次数:12Top
1 楼openxyj(爱我所爱,想我所想)回复于 2005-02-03 12:54:59 得分 0
upTop
2 楼microwind8888(风)回复于 2005-02-03 13:05:55 得分 0
帮你upTop
3 楼openxyj(爱我所爱,想我所想)回复于 2005-02-03 13:40:58 得分 0
高手帮忙呀,小弟不慎感激!!Top
4 楼zjcxc(邹建)回复于 2005-02-03 14:17:13 得分 10
select e.工号,e.姓名
,d.部门名称
,记录数=case when b.工号 is null then 0 else 1 end
+case when c.工号 is null then 0 else 1 end
,旷工时数=isnull(b.旷工时数,0)
,日常请假汇总=isnull(c.日常请假汇总,0)
,双休日请假=isnull(c.双休日请假,0)
,年休假=isnull(c.年休假,0)
from employee e
join department d on e.部门代号=d.部门代号
left join(
select 工号
,旷工时数=sum(旷工时数)
from duty
group by 工号
)b on e.工号=b.工号
left join(
select 工号
,日常请假汇总=sum(请假时数)-sum(双休日请假)-sum(年休假)
,双休日请假=sum(双休日请假)
,年休假=sum(年休假)
from holidays
group by 工号
)c on e.工号=c.工号
Top
5 楼wwg_yuyin(向生命贷款)回复于 2005-02-03 14:22:05 得分 0
帮你先顶,等下来收分,呵呵Top
6 楼openxyj(爱我所爱,想我所想)回复于 2005-02-03 14:40:56 得分 0
TO: zjcxc(邹建)
运行结果
服务器: 消息 409,级别 16,状态 2,行 1
sum or average aggregate 运算不能以 bit 数据类型作为参数。
服务器: 消息 409,级别 16,状态 1,行 1
sum or average aggregate 运算不能以 bit 数据类型作为参数。
服务器: 消息 409,级别 16,状态 1,行 1
sum or average aggregate 运算不能以 bit 数据类型作为参数。
服务器: 消息 409,级别 16,状态 1,行 1
sum or average aggregate 运算不能以 bit 数据类型作为参数。
Top
7 楼zjcxc(邹建)回复于 2005-02-03 15:07:13 得分 0
select e.工号,e.姓名
,d.部门名称
,记录数=case when b.工号 is null then 0 else 1 end
+case when c.工号 is null then 0 else 1 end
,旷工时数=isnull(b.旷工时数,0)
,日常请假汇总=isnull(c.日常请假汇总,0)
,双休日请假=isnull(c.双休日请假,0)
,年休假=isnull(c.年休假,0)
from employee e
join department d on e.部门代号=d.部门代号
left join(
select 工号
,旷工时数=sum(cast(旷工时数 as int))
from duty
group by 工号
)b on e.工号=b.工号
left join(
select 工号
,日常请假汇总=sum(cast(请假时数 as int))-sum(cast(双休日请假 as int))-sum(cast(年休假 as int))
,双休日请假=sum(cast(双休日请假 as int))
,年休假=sum(cast(年休假 as int))
from holidays
group by 工号
)c on e.工号=c.工号
Top
8 楼openxyj(爱我所爱,想我所想)回复于 2005-02-03 15:35:36 得分 0
现产生的结果如下:
工号 姓名 部门 记录数 旷工时数 日常请假汇总 双休日请假 年休假
001 张三 管理部 2 1 2 0 0
002 李4 管理部 2 0 1 1 0
003 王5 MIS 1 0 0 0 0
zjcxc(邹建)兄,再麻烦你看一下!!!!!!
Top
9 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-02-03 15:36:03 得分 0
SELECT
a.工号,
a.姓名,
b.部门名称,
记录数 = isnull(c.记录数,0),
旷工时数 = isnull(c.旷工时数),
日常请假汇总 = isnull(d.日常请假汇总),
双休日请假 = isnull(d.双休日请假),
年休假 = isnull(d.年休假)
FROM
employee a
INNER JOIN
department b
ON
a.部门代号 = b.部门代号
LEFT JOIN
(SELECT 工号,COUNT(旷工时数) AS 记录数,SUM(旷工时数) AS 旷工时数 FROM duty GROUP BY 工号) c
ON
a.工号 = c.工号
LEFT JOIN
(SELECT
工号,
SUM(CASE WHEN (双休日请假 = 0 AND 年休假 = 0) THEN 请假时数 ELSE 0 END) AS 日常请假汇总
SUM(CASE WHEN (双休日请假 = 1) THEN 请假时数 ELSE 0 END) AS 双休日请假
SUM(CASE WHEN (年休假 = 1) THEN 请假时数 ELSE 0 END) AS 年休假
FROM
holidays) d
ON
a.工号 = d.工号
ORDER BY
a.工号Top
10 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-02-03 15:36:27 得分 0
SELECT
a.工号,
a.姓名,
b.部门名称,
记录数 = isnull(c.记录数,0),
旷工时数 = isnull(c.旷工时数),
日常请假汇总 = isnull(d.日常请假汇总),
双休日请假 = isnull(d.双休日请假),
年休假 = isnull(d.年休假)
FROM
employee a
INNER JOIN
department b
ON
a.部门代号 = b.部门代号
LEFT JOIN
(SELECT 工号,COUNT(旷工时数) AS 记录数,SUM(旷工时数) AS 旷工时数 FROM duty GROUP BY 工号) c
ON
a.工号 = c.工号
LEFT JOIN
(SELECT
工号,
SUM(CASE WHEN (双休日请假 = 0 AND 年休假 = 0) THEN 请假时数 ELSE 0 END) AS 日常请假汇总
SUM(CASE WHEN (双休日请假 = 1) THEN 请假时数 ELSE 0 END) AS 双休日请假
SUM(CASE WHEN (年休假 = 1) THEN 请假时数 ELSE 0 END) AS 年休假
FROM
holidays) d
ON
a.工号 = d.工号
ORDER BY
a.工号Top
11 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-02-03 15:46:12 得分 20
楼上的有误,修改如下:
--生成测试数据
create table duty(
工号 varchar(20),
初始日期 varchar(20),
旷工时数 int
)
insert into duty values('001','05-01-01',0)
insert into duty values('001','05-01-02',1)
insert into duty values('002','05-01-01',0)
insert into duty values('002','05-01-02',0)
insert into duty values('003','05-01-01',0)
create table employee(
工号 varchar(20),
姓名 varchar(20),
部门代号 varchar(20)
)
insert into employee values('001','张三','b1')
insert into employee values('002','李4 ','b1')
insert into employee values('003','王5 ','b2')
create table department(
部门代号 varchar(20),
部门名称 varchar(20)
)
insert into department select 'b1','管理部'
insert into department select 'b2','MIS'
create table holidays(
工号 varchar(20),
日期 varchar(20),
请假时数 int,
双休日请假 bit,
年休假 bit)
insert into holidays select '001','05-01-01',2,0,0--'双休日和年休假为0时为'日常请假'
insert into holidays select '002','05-01-02',2,1,0
--执行查询
SELECT
a.工号,
a.姓名,
b.部门名称,
记录数 = isnull(c.记录数,0),
旷工时数 = isnull(c.旷工时数,0),
日常请假汇总 = isnull(d.日常请假汇总,0),
双休日请假 = isnull(d.双休日请假,0),
年休假 = isnull(d.年休假,0)
FROM
employee a
INNER JOIN
department b
ON
a.部门代号 = b.部门代号
LEFT JOIN
(SELECT 工号,COUNT(旷工时数) AS 记录数,SUM(旷工时数) AS 旷工时数 FROM duty GROUP BY 工号) c
ON
a.工号 = c.工号
LEFT JOIN
(SELECT
工号,
SUM(CASE WHEN (双休日请假 = 0 AND 年休假 = 0) THEN 请假时数 ELSE 0 END) AS 日常请假汇总,
SUM(CASE WHEN (双休日请假 = 1) THEN 请假时数 ELSE 0 END) AS 双休日请假,
SUM(CASE WHEN (年休假 = 1) THEN 请假时数 ELSE 0 END) AS 年休假
FROM
holidays
GROUP BY
工号) d
ON
a.工号 = d.工号
ORDER BY
a.工号
Top
12 楼jialiuer()回复于 2005-02-03 16:54:05 得分 5
select table3.工号, table3.姓名, table3.部门名称, table3.记录数, table3.旷工时数, table4.请假时数, table4.双休日请假, table4.年休假 from
(
select table1.工号, table2.姓名,table2.部门名称, table1.记录数, table1.旷工时数 from
(
select 工号, count(*) as 记录数, sum(旷工时数) as 旷工时数 from duty
group by 工号
) as table1,
(
select employee.工号, employee.姓名, department.部门名称
from employee,department
where employee.部门代号=department.部门代号
) as table2
where table1.工号=table2.工号
) as table3,
(
(
select employee.工号,holidays.请假时数, holidays.双休日请假, holidays.年休假
from employee, holidays
where employee.工号=holidays.工号
)
union all
(
select 工号, 0 as 请假时数, 0 as 双休日请假, 0 as 年休假
from employee
where 工号 not in (select 工号 from holidays)
)) as table4
where table3.工号=table4.工号
Top




