搭建论坛《搭建之星》论坛数据库交流 → [求助]关于统计SQL语句


  共有2742人关注过本帖树形打印

主题:[求助]关于统计SQL语句

帅哥哟,离线,有人找我吗?
sxxzxg
  1楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:技师 帖子:163 积分:830 威望:0 精华:0 注册:2006-1-21 11:14:39
[求助]关于统计SQL语句  发帖心情 Post By:2011-6-3 23:05:49

 

  约考时间    及格时间 
   2011-05-10    
   2011-05-11    2011-05-11
   2011-05-12    
   2011-05-13    2011-05-13
如图:如何用SQL语句统计已有约考时间且没有及格时间的数据。谢谢!

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
seedog
  2楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:助工 帖子:225 积分:1909 威望:0 精华:0 注册:2009-6-6 13:51:24
  发帖心情 Post By:2011-6-4 9:07:06

你是要统计没有及格的人数吗?

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
sxxzxg
  3楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:技师 帖子:163 积分:830 威望:0 精华:0 注册:2006-1-21 11:14:39
  发帖心情 Post By:2011-6-4 18:49:19

我是统计已有约考时间且没有及格时间的数据,因为还有没有约考时间的数据。

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
mysoap
  4楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:305 积分:2860 威望:0 精华:0 注册:2008-7-4 9:48:31
  发帖心情 Post By:2011-6-5 7:53:22

给你一个参考答案:

select count(*) from 表名 where (约考时间 is not NULL) and (及格时间 is NULL)


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
mysoap
  5楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:305 积分:2860 威望:0 精华:0 注册:2008-7-4 9:48:31
  发帖心情 Post By:2011-6-5 8:04:10

下面是“微软”的权威技术资料:

http://technet.microsoft.com/zh-cn/library/ms174065(SQL.110).aspx

 


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
mysoap
  6楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:305 积分:2860 威望:0 精华:0 注册:2008-7-4 9:48:31
  发帖心情 Post By:2011-6-5 8:11:30

【SQL】避免Access和SQL Server的空值冲突【转】
2010-05-19 15:33

在链接到一个SQL Server数据库的Access项目(即.adp文件)中,你平时经常使用的Access函数通常是不支持的。但大多数时候,都可换用SQL Server支持的一个Transact-SQL(T-SQL)函数。一个特例是Access的空值(Null)函数Nz和IsNull;它们的功能相似,但并不是Access和T-SQL都能支持它们。本文要讨论在什么时候以及如何使用这两个函数来处理空值。

空值的重要性

空值是完全合法的数据库录入项,它们能提供的信息可能超过你的想象。空值指明一个值是未知的,但这并不是说该值不可接受或者不存在。空值表明一个值尚未确定,而且除非确定了合适的值,否则该值将保持未知状态,也就是为一个空值。

开发者的职责是判断空值可能在什么时候出现,并针对性地处理那些值。一个方案是在数据输入时拒绝空值,从而完全回避它们。但这样一来,你的数据将完全禁止空值,所以该方案的缺点在于,在你创建一条记录时,所有数据都必须是已知的。遗憾的是,对于大多数人来说,这个方案都不现实。以医院急诊室的数据库系统为例,是不是因为数据录入员不知道一个病人的中间名,就拒绝为其创建一条记录呢?所以,对空值进行妥善处理可提供更灵活的方案,因为即使数据录入员当时不知道所有数据,也能成功地创建记录。

认识到空值无法避免之后,你的职责就是正确处理它们,确保它们不会导致错误。正确处理空值有两方面的好处:

  • 可与用户共享有意义的信息。
  • 可提前捕捉空值,避免空值在后续的表达式中返回错误。
Access 中的空值

Access提供大量工具来操纵空值:

  • Is Null——在条件表达式和SQL WHERE子句中使用Is Null。
  • IsNull——将IsNull用于Visual Basic for Applications(VBA)。
  • Nz——遇到空值时,用Nz返回除Null之外的其他值。

以上函数在本质上存在细微差异。Is Null和IsNull捕捉空值;而Nz函数处理空值。换言之,如果想返回的不是实际存储的空值,就使用Nz。例如,你可显示一个简单字符串(例如"N/A"),让用户知道数据对于当前记录来说“不可用”。另外,当空值在表达式中使用之前,你可以捕捉空值,因为空值经常会返回错误。

通过链接表或者Access项目来使用Access和SQL Server时,会产生一个问题,因为Access和SQL Server不是用相同的函数来判断空值。因此,你必须知道要使用什么函数,以及在什么时候使用。

在.mdb文件中使用Nz

大多数Access用户和开发者都熟悉Nz函数,它在遇到空值时返回除空值之外的其他值。该函数的形式如下,其中variant代表Variant数据类型,而valueifnull是一个可选参数,它负责在variant为空值时提供真正的返回值。



Nz(variant[, valueifnull])

如省略valueifnull,Nz返回值0或一个零长度字符串(""),具体由variant的数据类型决定。

图A的查询展示了如何使用Nz及其结果。该查询基于Access示例数据库Northwind中的Employees表。

 

图A

 

两个Nz函数都返回字符串数据类型,因为Region的数据类型为Text



B所示,两个Nz函数都返回字符串值,而不是空值,但具体的字符串是不同的。第一个表达式返回字符串"N/A"来取代空值:



WithOptional: Nz([Region],"N/A")

通过返回一个实际的字符串或者值,可为用户提供比空值更多的信息。字符串"N/A"明确指出:当前记录没有合适的值。相反,如返回空值,那么一个空白的字段可能使不熟悉的用户产生误解。

 

图B

 

Nz返回一个实际的值,而不是容易使人产生误解的空值第二个表达式返回零长度的字符串来取代空值:



WithoutOptional: Nz([Region])

虽然这样为用户提供的信息较少,但却有效防止了在后续的表达式中使用空值,从而避免数据库出错。C显示的新表达式证明了这一点。

图C

 

表达式可能不能像预期的那样处理空值

两个表达式都直接或间接依赖于Region字段中的值。第一个表达式直接引用Region字段:



RegionString: IIf([Region]="","N/A",[Region])

只看表达式,你可能认为结果记录集的每个字段中都应该出现一个字符串。D展示了实际结果,它和你设想的不符,并不是每个字段都包含一个字符串。事实上,只有在字段包含零长度字符串("")的前提下,表达式才会返回字符串"N/A"。我们知道,这些看似空白的字段包含空值,而不是零长度的字符串。但是,错误是可以理解的,也是能避免的。

图D

 

遇到空值时,用Nz返回值而不是错误

下一个表达式也引用了Region值,只是通过Nz函数的结果来间接地引用:



WithoutOptionalString: IIf([WithoutOptional]="","N/A",[WithoutOptional])

这样一来,任何空值都可用一个更确切的值来表示,并在后续任何表达式中进行求值。如图D所示,表达式在处理空白Region字段时没什么问题。只有“未预计到”或者“未知”的空值才会导致问题。

Nz在项目中无法工作

有人以为Access项目也支持Nz函数,但实情并非如此。记住,项目中的表是真正的SQL Server表。要证明这一点非常简单,只需使用Access配套提供的示范项目NorthwindCS.adp。以Employees表的一个简单视图为基础,并像前面在Microsoft数据库(.mdb)文件中那样使用Nz函数,如E所示。试图运行该查询时,Access会返回一个错误。

图E

 

Access项目不支持Nz函数
在Access项目中使用Nz

在项目中不能使用Nz,而应换用Transact SQL的IsNull函数。该函数的作用与Nz相似,它的形式如下:



IsNull(expression, valueifnull)

两个参数都是必需的,IsNull结果值的类型由expression决定。如果valueifnull的列数据类型与expression的数据类型冲突,SQL Server会在你试图输入表达式时返回一个错误。例如,假如expression基于一个数值列,而valueifnull是一个字符串,两个参数就会产生冲突。由于SQL Server无法解决冲突,所以会拒绝表达式。

为了解决上例(图E)的问题,可将Nz替换成IsNull表达式,如F所示:



IsNull(Region, 'N/A')

结果与图B相同(在WithOptional字段中)。

图F

 

在Access项目中用IsNull代替Nz


避免空值错误

Access和SQL Server用不同的函数来处理空值(分别是Nz和IsNull)。正确处理空值可防止数据库出现运行时错误和生成无效数据。不要回避空值,只需正确地处理它们。


个人经验:acess中的isnull(x)转换为sql中的语句可写为x is null

转自:http://blog.sina.com.cn/s/blog_49ab66a5010006rp.html

通过前面的学习可知,除非在创建时指定了NOT NULL约束,数据库表中某些列的值可以为NULL。什么是NULL?顾名思义,NULL就是空,在数据库中,含有空值的表的列的长度为零。

具体来讲,NULL与0、空字符串、空格都不同,等价于没有任何值,是未知数。然而,NULL却是一个数据值,而且它属于一个域。例如一个字符串字段,其中的NULL只能是一个字符串。尽管它的内容没有定义,或者未知,但它是字符串,这一点无可置疑。

对于NULL,一般的运算,比如加、减、乘、除,都会返回NULL。永远不会有什么数据等于NULL。当然,1不等于NULL,2也一样。注意,NULL也不等于NULL,说一个NULL等于NULL是错误的。

在SQL中,表达式“X=NULL”,结果应当是UNKOWN。而表达式“X IS NULL”,就得看情况,如果X是NULL,就返回TRUE;X不为NULL,则返回FALSE。

因此,在WHERE子句中,判断一个值是否为NULL,只能采用IS [NOT] NULL判别式。下面通过具体实例说明IS [NOT] NULL判别式的用法。

实例19 使用IS [NOT] NULL判别式处理NULL值

本实例将实现实例17提出的查询功能,即在BookInfo表中,查询图书读者的读者编号不大于9704(包括没有读者,为NULL)的所有图书记录,代码如下:

USE Library
SELECT *
FROM BookInfo
WHERE NOT reader>9704
OR reader IS NULL
运行该代码,得到的查询结果如图4.20所示。
图4.20 查询结果

可见,相比实例17,此时才得到了正确的结果。

★ 说明 ★

SAL IS NULL不可以写成SAL=NULL;除了IS [NOT] NULL之外,空值不满足任何查找条件;如果NULL参与算术运算,则该算术表达式的值为NULL;如果NULL参与比较运算,则结果为UNKNOWN;如果NULL参与聚集运算,则除count(*)之外其他聚集函数都忽略NULL。


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部

返回版面帖子列表

[求助]关于统计SQL语句








签名