请教一个复杂的SQL语句的写法(200分)

  • 主题发起人 主题发起人 foxling
  • 开始时间 开始时间
F

foxling

Unregistered / Unconfirmed
GUEST, unregistred user!
原表结构如下:
ID 日期 类型

1 2001-01-01 迟到
2 2001-01-01 早退
3 2001-01-01 缺勤
1 2001-01-02 迟到
2 2001-01-02 早退
3 2001-01-02 缺勤
1 2001-03-05 迟到
2 2001-03-05 早退
3 2001-03-05 缺勤

通过使用一个SQL语句,统计出1月份(按月份统计,不是统计全部表数据)考勤情况
得出下表:

ID 迟到 早退 缺勤

1 2 0 0
2 0 2 0
3 0 0 2
 
select id,
count(case when 类型=迟到 then 1 else 0 end) as 迟到,
...
sql server
 
Query1.close;
query1.sql.clear;
Query1.sql.add('select distinct ID from talbe1');
Query1.open;
while not Table1.eof do
begin
Query2.Close;
query2.sql.clear;
query2.sql.add('select sum(id) from table1 where 日期 between (2002-1-1,2002-1-31) and 类型=迟到')
Query2.open;
迟到次数:=Query2.Fields[0];
Query2.Close;
......
Query1.Next;
end;
 
没有测试,你自己试试看吧![:D]
 
nulk说得好:
select id,
count(case when 类型='迟到' then 1 else 0 end) as 迟到,
count(case when 类型='早退' then 1 else 0 end) as 早退 ,
count(case when 类型='缺勤' then 1 else 0 end) as 缺勤,
from talbe1
 
应该是sum吧? 对count来说, 为1和为0都是一条纪录。 而且这句99%会报错。 请你想象一下结果集如何排列的?
想象一下, select id from table1获得的是什么? select count(....) from table1又获得的是什么? 两个结果怎么可能用select不加任何关联或限制而合并在一起?
至少得加group by吧?
但是如果'类型'不出现在group by列表中则肯定出错, 如果出现了, 就不可能形成id唯一的结果纪录(每个id会多至3条纪录)。显然与提问的要求不符合。
所以要求的结果集并不是一句sql语句可以实现的
 
select id,
sum(case when 类型='迟到' then 1 else 0 end) as 迟到,
sum(case when 类型='早退' then 1 else 0 end) as 早退 ,
sum(case when 类型='缺勤' then 1 else 0 end) as 缺勤,
from talbe1
where 日期 between '.....' and '.......'
 
谢谢各位!
 
多人接受答案了。
 
后退
顶部