A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 聂广强 中级黑马   /  2013-7-12 22:37  /  1349 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 聂广强 于 2013-7-25 14:59 编辑

信息表『工号,姓名,迟到次数』T_Worker『Uid,name,lateLog』迟到表『工号,迟到日期,迟到时长』T_Late『Uid,latetime,latelong』
1)查询员工姓名含有O的员工在昨天迟到的时长!(每天只会记一次迟到)
select name, latelong fromT_Late
joinT_Worker on (T_Worker.Uid =T_Late.Uid)
where name LIKE '%O%' and Datediff(d,GETDATE(),latetime)=1



2)跟新表每个员工迟到次数为“上月迟到次数”次数之和
用getdate   datediff

update a
set a.latetimes= c.times
from T_Worker a ,T_Late b ,(select a.Uid ,COUNT(1) as times from T_Worker a, late b where a.Uid=b.Uid and b.latetime is not null group by a.Uid) as c
where a.Uid =b.Uid and a.Uid =c.Uid



这个是我写的sql语句貌似有点问题 该怎么解决


1 个回复

倒序浏览
本帖最后由 彭家贰小姐 于 2013-7-13 10:23 编辑

1.表的建立
  • T_Worker


  • T_Late
   
2.问题
  • 查询员工姓名含有O的员工在昨天迟到的时长!(每天只会记一次迟到)
  1. SELECT T_Worker.Uid,name ,
  2. CASE WHEN latelong IS NULL THEN 0 ELSE latelong END latelong
  3. FROM dbo.T_Worker
  4. LEFT JOIN (SELECT * FROM dbo.T_Late WHERE latetime = CONVERT(VARCHAR(10),GETDATE()-1,120) ) AS temp ON dbo.T_Worker.Uid = temp.Uid
  5. WHERE name LIKE N'%荣%'
复制代码

说明: 1. 昨天 CONVERT(VARCHAR(10),GETDATE()-1,120) )
        2.颜荣州 昨天没有迟到 所以要记录为 0 CASE WHEN latelong IS NULL THEN 0 ELSE latelong END

  • 跟新表每个员工迟到次数为“上月迟到次数”次数之和用getdate datediff
疑问:1.T_Worker这张表的迟到次数不是应该记录总的吗?为什么要更新为上月迟到的次数呢?
       2.如果一个人上个月没迟到 是不是 在T_Worker表中他的迟到次数 就为 0 ?
  1. IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp
  2. SELECT T_Worker.Uid, (CASE WHEN times IS NULL THEN 0 ELSE times END )AS times
  3. INTO #temp
  4. FROM dbo.T_Worker
  5. LEFT JOIN (
  6.      SELECT Uid, COUNT(1) AS times
  7.      FROM dbo.T_Late
  8.      WHERE latetime BETWEEN
  9.      DATEADD(MONTH,-1,DATEADD(DAY,1-DAY(GETDATE()),CONVERT(VARCHAR(8),GETDATE(),112)))
  10.      AND
  11.      DATEADD(MILLISECOND,-2,DATEADD(DAY,1-DAY(GETDATE()),CONVERT(VARCHAR(8),GETDATE(),112)))
  12.      GROUP BY Uid
  13. ) AS a
  14. ON dbo.T_Worker.Uid = a.Uid</P>
  15. <P>UPDATE dbo.T_Worker
  16. SET lateLog = #temp.times
  17. FROM dbo.T_Worker LEFT JOIN #temp ON dbo.T_Worker.Uid = #temp.Uid
  18. IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp</P>
复制代码

说明:  1.上个月用DATEADD处理的
         2. IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp 是创建临时表的意思 创建之后要删除 所以前后都加了这一句
         3. 可以实现 如果一个人上个月没有迟到 则 T_Worker的次数为0

第二个问题写的复杂了, 同求简单方法.....


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马