1. 我有一张表如下:
AttTime(datetime) Emp(nvarchar) Dept(nvarchar)
2008-08-02 6:45 zhangsan A
2008-08-02 18:20 zhangsan A
2008-08-02 11:22 zhangsan A
2008-08-02 18:20 zhangsan A
2008-08-08 7:15 zhangsan A
2008-08-08 19:12 zhangsan A
2008-08-01 6:41 ww A
2008-08-01 8:41 ww A
2008-08-01 17:20 ww A
2008-08-06 7:11 ww A
2008-08-06 18:12 ww A
2008-08-04 8:13 lisi B
2.想要得到数据如下:
即得到指定Dept(A)下的所有Emp(zhangsan,ww)的AttTime记录,并按每个人分组显示,求出每个人每天的最大时间和最小时间,
没有记录的日期用空的补全。
AttDate minAttTime maxAttTime Emp Dept
<chsdate w:st="on" year="2008" month="8" day="2" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-02</span></chsdate> 6:45 18:20 zhangsan A
<chsdate w:st="on" year="2008" month="8" day="3" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-03</span></chsdate> null null zhangsan A
<chsdate w:st="on" year="2008" month="8" day="4" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-04</span></chsdate> null null zhangsan A
<chsdate w:st="on" year="2008" month="8" day="5" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-05</span></chsdate> null null zhangsan A
<chsdate w:st="on" year="2008" month="8" day="6" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-06</span></chsdate> null null zhangsan A
<chsdate w:st="on" year="2008" month="8" day="7" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-07</span></chsdate> null null zhangsan A
<chsdate w:st="on" year="2008" month="8" day="8" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-08</span></chsdate> 7:15 19:12 zhangsan A
<chsdate w:st="on" year="2008" month="8" day="1" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-01</span></chsdate> 6:41 17:20 ww A
<chsdate w:st="on" year="2008" month="8" day="2" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-02</span></chsdate> null null ww A
<chsdate w:st="on" year="2008" month="8" day="3" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-03</span></chsdate> null null ww A
<chsdate w:st="on" year="2008" month="8" day="4" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-04</span></chsdate> null null ww A
<chsdate w:st="on" year="2008" month="8" day="5" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-05</span></chsdate> null null ww A
<chsdate w:st="on" year="2008" month="8" day="6" islunardate="False" isrocdate="False"><span lang="EN-US">2008-08-06</span></chsdate> 7:11 18:12 ww A
3.答案如下:
--> 生成测试数据: @AttRecords
CREATE TABLE AttRecords(AttTime DATETIME,Emp VARCHAR(8),Dept VARCHAR(1))
INSERT INTO AttRecords
SELECT '2008-08-02 6:45','zhangsan','A' UNION ALL
SELECT '2008-08-02 18:20','zhangsan','A' UNION ALL
SELECT '2008-08-02 11:22','zhangsan','A' UNION ALL
SELECT '2008-08-02 18:20','zhangsan','A' UNION ALL
SELECT '2008-08-08 7:15','zhangsan','A' UNION ALL
SELECT '2008-08-08 19:12','zhangsan','A' UNION ALL
SELECT '2008-08-01 6:41','ww','A' UNION ALL
SELECT '2008-08-01 8:41','ww','A' UNION ALL
SELECT '2008-08-01 17:20','ww','A' UNION ALL
SELECT '2008-08-06 7:11','ww','A' UNION ALL
SELECT '2008-08-06 18:12','ww','A' UNION ALL
SELECT '2008-08-04 8:13','lisi','B'
--SQL查询如下:
--在实际中.应该在数据库中建立一个序号表来代替master.dbo.spt_values
GO
CREATE VIEW dbo.v_Test
AS
SELECT
A.Emp,A.Dept,
CONVERT(VARCHAR(10),A.AttTime,120) AS AttTime,
CONVERT(VARCHAR(10),MIN(B.AttTime),108) AS MinAttTime,
CONVERT(VARCHAR(10),MAX(B.AttTime),108) AS MaxAttTime
FROM (SELECT A.ID,B.Dept,B.Emp,DATEADD(day,A.ID,B.MinAttTime) AS AttTime
FROM (SELECT number AS ID FROM master.dbo.spt_values WHERE type = 'p') AS A
CROSS JOIN (SELECT Dept,Emp,MIN(AttTime) AS MinAttTime,MAX(AttTime) AS MaxATtTime
FROM AttRecords WHERE Dept = 'A' GROUP BY Dept,Emp ) AS B
WHERE DATEADD(day,A.ID,B.MinAttTime) <= B.MaxAttTime) AS A
LEFT JOIN <place w:st="on"><city w:st="on">AttRecords</city><state w:st="on"><span style="color: blue">AS</span></state></place> B
ON DATEDIFF(day,B.AttTime,A.AttTime) = 0 AND A.Emp = B.Emp AND A.Dept = B.Dept
GROUP BY A.Dept,A.Emp,CONVERT(VARCHAR(10),A.AttTime,120);
GO
SELECT * FROM dbo.v_Test ORDER BY Dept,Emp,AttTime;
GO
DROP VIEW dbo.v_Test;
DROP TABLE AttRecords;
问下这个查询如果用linqtosql直接对AttRecords查询如何才能得到我想要的数据呢?
分享到:
相关推荐
内容:本章介绍SQL语句的条件查询和排序操作。 产品:Oracle 10g 技术:SQL语句、Sql*Plus 难度:★★☆☆☆
│ 得到一个字符串在另一个字符串中出现的次数.sql │ 数字转换成十六进制.sql │ 比较第一与第二个字符串,是否有连续的5个字符相同.sql │ 生成查询的模糊匹配字符串.sql │ 简繁转换.sql │ 统计一个表中某个字符...
统计一个表中某个字符出现最多的字母.sql │ 非法字符串处理.sql │ ├─第04章 │ │ 4.1.5 在各种处理中应用排序规则的示例.sql │ │ 4.2.1 排序规则在拼音处理中的应用.sql │ │ ...
6、增加一个列 7、添加和删除主键 8、索引 9、视图 10、几个简单的基本的sql语句 11、几个高级查询运算词 12、使用外连接 13、分组:Group by: 14、对数据库进行操作: 15.如何修改数据库的名称: 第二部分...
工作中常用的SQL + 超复杂SQL 交叉连接查询corss.txt 公交线路问题.txt 。。。。 充储过程--sql0.sql 分割字符串.txt 分布式查询.txt 分组排列进行更新.txt 别名.txt 动态SQL语句.txt 动态语句.txt 区分大小写.txt ...
3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段 alter table tablename --添加一个自增列 add...
4.6 基于集合的方法和迭代/过程方法的比较,以及一个优化练习2 4.7 总结 第5章 算法和复杂性 5.1 你有一个1夸特的硬币吗? 5.1.1 如何从零钱罐中取回1夸特钱 5.1.2 有时零钱罐中没有1夸特的硬币 5.2 如何度量...
第1章 数据库与sql基础 1 1.1 数据库的基本概念 1 1.1.1 数据库的由来 1 1.1.2 数据库系统的概念 3 1.2 数据库系统的结构、组成及工作流程 3 1.2.1 数据库的体系结构 3 1.2.2 数据库系统的组成 4 1.2.3 ...
作为一本讲述T-SQL高级查询的专业图书,《Microsoft SQL Server 2008技术内幕:T-SQL查询》旨在结合实践中的各种常见问题,教读者如何用SQL作为语言工具来思考问题,揭示基于集合查询的强大威力。《Microsoft SQL ...
5.2.13 得到一个ASCII码数字对应的字符 5.2.14 发音匹配度 5.3 日期时间函数 5.3.1 日期、时间、日期时间与时间戳 5.3.2 主流数据库系统中日期时间类型的表示方式 5.3.3 取得当前日期时间 5.3.4 日期...
全书共327页,分为:SQL数据库综述、基本数据类型、数据库对象的概念及完整性约束、规格化数据库、管理数据库事务、查改删增、操作符、汇总函数、数据排序和分组、字符函数、日期和时间、数据库用户权限管理、数据库...
当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值;如果表之间有匹配行,则整个结果集行包含基表的数据值。 1.6.4.2 语法 select A.*, B.* from student_A A full outer join student_B B on A.Uuid...
最后一篇是综合案例篇,分别使用.NET和Java语言实现了与SQL Server 2008的连接,并完成了图书管理系统和在线订餐系统。 第一篇 SQL Server 2008基础篇 第1章 学习数据库的准备 ( 教学视频:58分钟) 15 1.1 认识...
本书不但融合了作者在使用SQL Server 2000过程中遇到的各种常见问题和应用案例,还总结了作者几年来在CSDN 社区SQL Server版所解决的大量问题,面向实际项目需求,涉及不同类型的应用,能够多角度地引导读者学习相关...
4.6 基于集合的方法和迭代/过程方法的比较,以及一个优化练习208 4.7 总结214 第5章 算法和复杂性215 5.1 你有一个1夸特的硬币吗?215 5.1.1 如何从零钱罐中取回1夸特钱216 5.1.2 有时零钱罐中没有1夸特的硬币...
5.2.13 得到一个ASCII码数字对应的字符 5.2.14 发音匹配度 5.3 日期时间函数 5.3.1 日期、时间、日期时间与时间戳 5.3.2 主流数据库系统中日期时间类型的表示方式 5.3.3 取得当前日期时间 5.3.4 日期...
由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。 NOT IN 此操作是强列推荐不使用的,因为不能应用表的索引。 推荐方案:用NOT EXISTS 或...
在处理SQL语句时,其中所有的空格都被忽略(空格只用来分开单词,连续多个空格当一个用)。 SQL语句可以在一行上写出,建议多行写出,便于阅读和调试。 多条SQL语句必须以分号分隔。多数DBMS不需要在单条SQL语句后...
3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段 alter table tablename --添加一个自增列 add...