求sql

jay3118891 2014-04-29 10:56:45
表已经给好,没发改,求一条sql
考勤表:uid 用户iD,utype(签到是0,签退是1,udate 签到日期 ulocation 签到地点(签到签退地点可以不同))
uid utype udate ulocation
10001 0 2014-04-15 08:32:18 海淀区复兴路47号
10001 1 2014-04-15 18:32:18 海淀区复兴路47号
10002 0 2014-04-15 08:33:19 海淀区复兴路36号
10002 1 2014-04-15 19:31:19 海淀区复兴路33号
10001 0 2014-04-16 08:09:18 海淀区复兴路47号
10001 1 2014-04-16 18:32:18 海淀区复兴路47号
10002 0 2014-04-16 09:33:19 海淀区复兴路36号
10002 1 2014-04-16 19:31:19 海淀区复兴路33号

查询一:
用户ID 日期 签到时间 签到地点 签退时间 签退地点
10001 2014-04-15 08:32:18 海淀区复兴路47号 18:32:18 海淀区复兴路47号
10002 2014-04-15 08:33:19 海淀区复兴路36号 19:31:19 海淀区复兴路33号
10001 2014-04-16 08:09:18 海淀区复兴路47号 18:32:18 海淀区复兴路47号
10002 2014-04-16 09:33:19 海淀区复兴路36号 19:31:19 海淀区复兴路33号
汇总查询:查询4月的出勤情况(0为缺勤,1为正常 -为迟到早退)
用户ID 正常天数(出勤) 缺勤 迟到早退 1. 2 3 4 ......15 16 ........30
10001 2 0 0 0 0 0 0 ......1 1 0 0 0....
10002 2 0 1 0 0 0 0...... .1 - 0 0 0 ...

求大神指点
...全文
164 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jay3118891 2014-04-29
  • 打赏
  • 举报
回复
引用 4 楼 ap0405140 的回复:

create table kq
(uid varchar(10),utype int,udate datetime,ulocation varchar(30))

insert into kq
 select '10001',0,'2014-04-15 08:32:18','海淀区复兴路47号' union all
 select '10001',1,'2014-04-15 18:32:18','海淀区复兴路47号' union all
 select '10002',0,'2014-04-15 08:33:19','海淀区复兴路36号' union all
 select '10002',1,'2014-04-15 19:31:19','海淀区复兴路33号' union all
 select '10001',0,'2014-04-16 08:09:18','海淀区复兴路47号' union all
 select '10001',1,'2014-04-16 18:32:18','海淀区复兴路47号' union all
 select '10002',0,'2014-04-16 09:33:19','海淀区复兴路36号' union all
 select '10002',1,'2014-04-16 19:31:19','海淀区复兴路33号'


-- 查询一
select a.[uid] '用户ID',
       convert(varchar(16),a.udate,23) '日期',
       max(case when [uid]=a.[uid] 
                     and convert(varchar,udate,23)=convert(varchar,a.udate,23)
                     and utype=0 then convert(varchar(16),udate,108) else '' end) '签到时间',
       max(case when [uid]=a.[uid] 
                     and convert(varchar,udate,23)=convert(varchar,a.udate,23)
                     and utype=0 then ulocation else '' end) '签到地点',    
       max(case when [uid]=a.[uid] 
                     and convert(varchar,udate,23)=convert(varchar,a.udate,23)
                     and utype=1 then convert(varchar(16),udate,108) else '' end) '签退时间',
       max(case when [uid]=a.[uid] 
                     and convert(varchar,udate,23)=convert(varchar,a.udate,23)
                     and utype=1 then ulocation else '' end) '签退地点'                        
 from kq a
 group by a.[uid],convert(varchar(16),a.udate,23)
 order by convert(varchar(16),a.udate,23)

/*
用户ID       日期               签到时间             签到地点                           签退时间             签退地点
---------- ---------------- ---------------- ------------------------------ ---------------- ------------------------------
10001      2014-04-15       08:32:18         海淀区复兴路47号                      18:32:18         海淀区复兴路47号
10002      2014-04-15       08:33:19         海淀区复兴路36号                      19:31:19         海淀区复兴路33号
10001      2014-04-16       08:09:18         海淀区复兴路47号                      18:32:18         海淀区复兴路47号
10002      2014-04-16       09:33:19         海淀区复兴路36号                      19:31:19         海淀区复兴路33号

(4 row(s) affected)
*/
大神麻烦在给那个统计指点下。。
唐诗三百首 2014-04-29
  • 打赏
  • 举报
回复

create table kq
(uid varchar(10),utype int,udate datetime,ulocation varchar(30))

insert into kq
 select '10001',0,'2014-04-15 08:32:18','海淀区复兴路47号' union all
 select '10001',1,'2014-04-15 18:32:18','海淀区复兴路47号' union all
 select '10002',0,'2014-04-15 08:33:19','海淀区复兴路36号' union all
 select '10002',1,'2014-04-15 19:31:19','海淀区复兴路33号' union all
 select '10001',0,'2014-04-16 08:09:18','海淀区复兴路47号' union all
 select '10001',1,'2014-04-16 18:32:18','海淀区复兴路47号' union all
 select '10002',0,'2014-04-16 09:33:19','海淀区复兴路36号' union all
 select '10002',1,'2014-04-16 19:31:19','海淀区复兴路33号'


-- 查询一
select a.[uid] '用户ID',
       convert(varchar(16),a.udate,23) '日期',
       max(case when [uid]=a.[uid] 
                     and convert(varchar,udate,23)=convert(varchar,a.udate,23)
                     and utype=0 then convert(varchar(16),udate,108) else '' end) '签到时间',
       max(case when [uid]=a.[uid] 
                     and convert(varchar,udate,23)=convert(varchar,a.udate,23)
                     and utype=0 then ulocation else '' end) '签到地点',    
       max(case when [uid]=a.[uid] 
                     and convert(varchar,udate,23)=convert(varchar,a.udate,23)
                     and utype=1 then convert(varchar(16),udate,108) else '' end) '签退时间',
       max(case when [uid]=a.[uid] 
                     and convert(varchar,udate,23)=convert(varchar,a.udate,23)
                     and utype=1 then ulocation else '' end) '签退地点'                        
 from kq a
 group by a.[uid],convert(varchar(16),a.udate,23)
 order by convert(varchar(16),a.udate,23)

/*
用户ID       日期               签到时间             签到地点                           签退时间             签退地点
---------- ---------------- ---------------- ------------------------------ ---------------- ------------------------------
10001      2014-04-15       08:32:18         海淀区复兴路47号                      18:32:18         海淀区复兴路47号
10002      2014-04-15       08:33:19         海淀区复兴路36号                      19:31:19         海淀区复兴路33号
10001      2014-04-16       08:09:18         海淀区复兴路47号                      18:32:18         海淀区复兴路47号
10002      2014-04-16       09:33:19         海淀区复兴路36号                      19:31:19         海淀区复兴路33号

(4 row(s) affected)
*/
jay3118891 2014-04-29
  • 打赏
  • 举报
回复
引用 1 楼 dotnetstudio 的回复:

select a.[uid] as [用户ID],CONVERT(varchar(10), a.udate,121) as [日期], a.[udate] as [签到时间]
, a.[ulocation] as [签到地点], b.[udate] as [签退时间], b.[ulocation] as [签退地点] from
(
  select * from [考勤表] where utype=0
) a
left join (
  select * from [考勤表] where utype=1
) b on a.[uid]=b.[uid]
比如早点8点30后是迟到 18:30 前是早退就行了,简单判断下
KeepSayingNo 2014-04-29
  • 打赏
  • 举报
回复
第2个汇总查询不知道你缺勤和迟到早退是怎么判断的?
KeepSayingNo 2014-04-29
  • 打赏
  • 举报
回复

select a.[uid] as [用户ID],CONVERT(varchar(10), a.udate,121) as [日期], a.[udate] as [签到时间]
, a.[ulocation] as [签到地点], b.[udate] as [签退时间], b.[ulocation] as [签退地点] from
(
  select * from [考勤表] where utype=0
) a
left join (
  select * from [考勤表] where utype=1
) b on a.[uid]=b.[uid]
jay3118891 2014-04-29
  • 打赏
  • 举报
回复
引用 7 楼 jiajiaren 的回复:
IF OBJECT_ID(N'KQ') IS  NOT NULL
DROP TABLE KQ
GO
CREATE TABLE KQ(uid VARCHAR(10),utype INT,udate DATETIME,ulocation VARCHAR(50))
INSERT INTO KQ  
SELECT '10001',0,'2014-04-15  08:32:18','海淀区复兴路47号' UNION ALL
SELECT '10001',1,'2014-04-15  18:32:18','海淀区复兴路47号' UNION ALL
SELECT '10002',0,'2014-04-15  08:33:19','海淀区复兴路36号' UNION ALL
SELECT '10002',1,'2014-04-15  19:31:19','海淀区复兴路33号' UNION ALL
SELECT '10001',0,'2014-04-16  08:09:18','海淀区复兴路47号' UNION ALL
SELECT '10001',1,'2014-04-16  18:32:18','海淀区复兴路47号' UNION ALL
SELECT '10002',0,' 2014-04-16  09:33:19','海淀区复兴路36号' UNION ALL
SELECT '10002',1,' 2014-04-16  19:31:19','海淀区复兴路33号'
 
 
-----------------------------------查询--------------------------------------------
 
SELECT  uid,CONVERT(DATE, udate) '日期', 
  CONVERT(VARCHAR,MAX(CASE  utype  WHEN 0 THEN  udate END),24) '签到时间',
  MAX(CASE  utype  WHEN 0 THEN  ulocation END) '签到地点', 
  CONVERT(VARCHAR,MAX(CASE  utype  WHEN 1 THEN  udate END),24) '签退时间',
  MAX(CASE  utype  WHEN 1 THEN  ulocation END) '签退地点'
  FROM KQ GROUP BY uid,CONVERT(DATE,udate) 
  
  
 /*
 uid        日期         签到时间                           签到地点                                               签退时间                           签退地点
---------- ---------- ------------------------------ -------------------------------------------------- ------------------------------ --------------------------------------------------
10001      2014-04-15 08:32:18                       海淀区复兴路47号                                          18:32:18                       海淀区复兴路47号
10002      2014-04-15 08:33:19                       海淀区复兴路36号                                          19:31:19                       海淀区复兴路33号
10001      2014-04-16 08:09:18                       海淀区复兴路47号                                          18:32:18                       海淀区复兴路47号
10002      2014-04-16 09:33:19                       海淀区复兴路36号                                          19:31:19                       海淀区复兴路33号

(4 行受影响)

 
 */
 
 GO
 
----------------------------------统计--------------------------------------------

 
DECLARE @sql VARCHAR(8000) ,
    @month INT ,--月份
    @mcount INT ,--月天数
    @mdate DATETIME ,--月初始值
    @i INT--计数
BEGIN
    SET @month = 4
    SET @i = 1
    SET @mdate = STR(YEAR(GETDATE())) + '-' + LTRIM(@month) + '-' + '1'
    SELECT  @mcount = DATEDIFF(dd, @mdate, DATEADD(mm, 1, @mdate))
 
    SET @sql = 'select  a.*,b.[正常天数(出勤)],b.[缺勤],b.[迟到早退]  from (select uid' 
    WHILE @i <= @mcount 
        BEGIN
            SET @sql = ISNULL(@sql + ',', '') + 'max(case day(udate)  when '
                + LTRIM(@i) + ' then [utype] else '''' end) as [' + LTRIM(@i)
                + ']'
            SET @i = @i + 1
        END
    SELECT  @sql = @sql + ' from KQ where month(udate)=' + LTRIM(@month)
            + ' group by uid ) a'  
           SELECT  @sql = @sql +   ',(SELECT  uid, SUM(CASE [utype] WHEN 1 THEN 1 ELSE 0 END)   ''正常天数(出勤)''   ,'
  SELECT  @sql = @sql +  ''+CONVERT(VARCHAR(20),@mcount)+'-SUM(CASE [utype] WHEN 1 THEN 1 ELSE 0 END) AS   ''缺勤'' , 
 SUM( 
 CASE    WHEN utype=0 AND Convert(varchar(20),udate,108)>Convert(varchar(20),''08:30:00'',108) THEN 1 
       WHEN utype=1 AND  Convert(varchar(20),udate,108)<Convert(varchar(20),''18:30:00'',108) THEN 1 
 ELSE 0 END) AS ''迟到早退'' 
  FROM KQ WHERE MONTH(udate)=4 GROUP BY uid) b WHERE a.uid=b.uid'
   EXEC(@sql)
END 
 /*
 
uid        1           2           3           4           5           6           7           8           9           10          11          12          13          14          15          16          17          18          19          20          21          22          23          24          25          26          27          28          29          30          正常天数(出勤)    缺勤          迟到早退
---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
10001      0           0           0           0           0           0           0           0           0           0           0           0           0           0           1           1           0           0           0           0           0           0           0           0           0           0           0           0           0           0           2           28          1
10002      0           0           0           0           0           0           0           0           0           0           0           0           0           0           1           1           0           0           0           0           0           0           0           0           0           0           0           0           0           0           2           28          2

(2 行受影响)
 */
威武,
jiajiaren 2014-04-29
  • 打赏
  • 举报
回复
IF OBJECT_ID(N'KQ') IS  NOT NULL
DROP TABLE KQ
GO
CREATE TABLE KQ(uid VARCHAR(10),utype INT,udate DATETIME,ulocation VARCHAR(50))
INSERT INTO KQ  
SELECT '10001',0,'2014-04-15  08:32:18','海淀区复兴路47号' UNION ALL
SELECT '10001',1,'2014-04-15  18:32:18','海淀区复兴路47号' UNION ALL
SELECT '10002',0,'2014-04-15  08:33:19','海淀区复兴路36号' UNION ALL
SELECT '10002',1,'2014-04-15  19:31:19','海淀区复兴路33号' UNION ALL
SELECT '10001',0,'2014-04-16  08:09:18','海淀区复兴路47号' UNION ALL
SELECT '10001',1,'2014-04-16  18:32:18','海淀区复兴路47号' UNION ALL
SELECT '10002',0,' 2014-04-16  09:33:19','海淀区复兴路36号' UNION ALL
SELECT '10002',1,' 2014-04-16  19:31:19','海淀区复兴路33号'
 
 
-----------------------------------查询--------------------------------------------
 
SELECT  uid,CONVERT(DATE, udate) '日期', 
  CONVERT(VARCHAR,MAX(CASE  utype  WHEN 0 THEN  udate END),24) '签到时间',
  MAX(CASE  utype  WHEN 0 THEN  ulocation END) '签到地点', 
  CONVERT(VARCHAR,MAX(CASE  utype  WHEN 1 THEN  udate END),24) '签退时间',
  MAX(CASE  utype  WHEN 1 THEN  ulocation END) '签退地点'
  FROM KQ GROUP BY uid,CONVERT(DATE,udate) 
  
  
 /*
 uid        日期         签到时间                           签到地点                                               签退时间                           签退地点
---------- ---------- ------------------------------ -------------------------------------------------- ------------------------------ --------------------------------------------------
10001      2014-04-15 08:32:18                       海淀区复兴路47号                                          18:32:18                       海淀区复兴路47号
10002      2014-04-15 08:33:19                       海淀区复兴路36号                                          19:31:19                       海淀区复兴路33号
10001      2014-04-16 08:09:18                       海淀区复兴路47号                                          18:32:18                       海淀区复兴路47号
10002      2014-04-16 09:33:19                       海淀区复兴路36号                                          19:31:19                       海淀区复兴路33号

(4 行受影响)

 
 */
 
 GO
 
----------------------------------统计--------------------------------------------

 
DECLARE @sql VARCHAR(8000) ,
    @month INT ,--月份
    @mcount INT ,--月天数
    @mdate DATETIME ,--月初始值
    @i INT--计数
BEGIN
    SET @month = 4
    SET @i = 1
    SET @mdate = STR(YEAR(GETDATE())) + '-' + LTRIM(@month) + '-' + '1'
    SELECT  @mcount = DATEDIFF(dd, @mdate, DATEADD(mm, 1, @mdate))
 
    SET @sql = 'select  a.*,b.[正常天数(出勤)],b.[缺勤],b.[迟到早退]  from (select uid' 
    WHILE @i <= @mcount 
        BEGIN
            SET @sql = ISNULL(@sql + ',', '') + 'max(case day(udate)  when '
                + LTRIM(@i) + ' then [utype] else '''' end) as [' + LTRIM(@i)
                + ']'
            SET @i = @i + 1
        END
    SELECT  @sql = @sql + ' from KQ where month(udate)=' + LTRIM(@month)
            + ' group by uid ) a'  
           SELECT  @sql = @sql +   ',(SELECT  uid, SUM(CASE [utype] WHEN 1 THEN 1 ELSE 0 END)   ''正常天数(出勤)''   ,'
  SELECT  @sql = @sql +  ''+CONVERT(VARCHAR(20),@mcount)+'-SUM(CASE [utype] WHEN 1 THEN 1 ELSE 0 END) AS   ''缺勤'' , 
 SUM( 
 CASE    WHEN utype=0 AND Convert(varchar(20),udate,108)>Convert(varchar(20),''08:30:00'',108) THEN 1 
       WHEN utype=1 AND  Convert(varchar(20),udate,108)<Convert(varchar(20),''18:30:00'',108) THEN 1 
 ELSE 0 END) AS ''迟到早退'' 
  FROM KQ WHERE MONTH(udate)=4 GROUP BY uid) b WHERE a.uid=b.uid'
   EXEC(@sql)
END 
 /*
 
uid        1           2           3           4           5           6           7           8           9           10          11          12          13          14          15          16          17          18          19          20          21          22          23          24          25          26          27          28          29          30          正常天数(出勤)    缺勤          迟到早退
---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
10001      0           0           0           0           0           0           0           0           0           0           0           0           0           0           1           1           0           0           0           0           0           0           0           0           0           0           0           0           0           0           2           28          1
10002      0           0           0           0           0           0           0           0           0           0           0           0           0           0           1           1           0           0           0           0           0           0           0           0           0           0           0           0           0           0           2           28          2

(2 行受影响)
 */
jay3118891 2014-04-29
  • 打赏
  • 举报
回复
引用 1 楼 dotnetstudio 的回复:

select a.[uid] as [用户ID],CONVERT(varchar(10), a.udate,121) as [日期], a.[udate] as [签到时间]
, a.[ulocation] as [签到地点], b.[udate] as [签退时间], b.[ulocation] as [签退地点] from
(
  select * from [考勤表] where utype=0
) a
left join (
  select * from [考勤表] where utype=1
) b on a.[uid]=b.[uid]
汇总怎么搞呢,头都大了。。。。求大神

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧