赞
踩
返回表或指定列中的行数的聚合函数。
COUNT(*)
COUNT([ALL | DISTINCT [BY(col-list)]] expression [%FOREACH(col-list)] [%AFTERHAVING])
*
- 指定应计算所有行以返回指定表中的总行数。COUNT(*)
不接受其他参数,不能与ALL
或DISTINCT
关键字一起使用。COUNT(*)
不接受表达式参数,也不使用任何特定列的信息。COUNT(*)
返回指定表或视图中的行数,但不消除重复项。NULL
值的行。ALL
- 可选-指定COUNT
返回表达式中所有值的计数。DISTINCT
- 可选-一个DISTINCT
子句,指定COUNT
返回表达式的不同(唯一)值的计数。DISTINCT
可以指定BY(colo -list)
子句,其中colo -list
可以是单个列名,也可以是用逗号分隔的列名列表。expression
- 任何有效的表达式。%FOREACH(col-list)
- 可选-列名或以逗号分隔的列名列表。%AFTERHAVING
- 可选-应用在HAVING
子句中的条件。COUNT
返回BIGINT
数据类型。
COUNT
聚合函数有两种形式:
COUNT(expression)
以整数形式返回表达式中值的数目的计数。COUNT(表达式)
不计算NULL
值。COUNT
总是返回数据类型BIGINT,
xDBC
长度为8
,精度为19
,刻度为0
。COUNT(*)
以整数形式返回表中行数的计数。COUNT(*)
计数所有行,无论是否存在重复的字段值或NULL
值。COUNT
可以在引用表或视图的SELECT
查询或子查询中使用。
COUNT
可以在SELECT
列表或HAVING
子句中与普通字段值一起出现。
COUNT
不能用于WHERE
子句。
COUNT
不能在JOIN
的ON
子句中使用,除非SELECT
是子查询。
与所有聚合函数一样,COUNT(expression)
可以接受一个可选的DISTINCT
子句。
DISTINCT
子句只计算那些具有不同(唯一)值的列。
什么是一个不同的值取决于字段的排序;
当字段具有默认的排序规则%SQLUPPER
时,字母大小写不同的值将不作为不同的值计算。
要将每个字母大小写变量作为一个不同的值进行计数,请使用count (distinct (%EXACT(field)))
。
COUNT DISTINCT
不将NULL
视为一个不同的值。
COUNT(DISTINCT BY(col2) col1)
计数不同的col2
值的col1
值;
但是,不同的col2
值可以包含一个NULL
作为不同的值。
ALL
关键字统计所有非null
值,包括所有重复值。
如果没有指定关键字,ALL
是默认行为。
如果没有选择行,COUNT
返回0
或NULL
,这取决于查询:
FROM
子句表中的字段的任何引用,那么COUNT
返回0
。COUNT
聚合函数返回0
;NULL
。%ROWCOUNT
为1
。ClassMethod Count() { s myquery = 3 s myquery(1) = "SELECT COUNT(*) AS Recs,COUNT(Name) AS People," s myquery(2) = "AVG(Age) AS AvgAge,MAX(Age) AS MaxAge,CURRENT_TIMESTAMP AS Now" s myquery(3) = " FROM Sample.Employee WHERE Name %STARTSWITH 'ZZZ'" s tStatement = ##class(%SQL.Statement).%New() s qStatus = tStatement.%Prepare(.myquery) if qStatus'=1 { w "%Prepare failed:" d $System.Status.DisplayError(qStatus) q } s rset = tStatement.%Execute() d rset.%Display() w !,"Rowcount:",rset.%ROWCOUNT }
DHC-APP> d ##class(PHA.TEST.SQLCommand).Count()
Recs People AvgAge MaxAge Now
0 0 2021-12-20 20:58:17
1 Rows(s) Affected
Rowcount:1
select-list
包含对FROM
子句表中某个字段的任何直接引用,或者如果指定了TOP 0
,那么COUNT
返回NULL
。%ROWCOUNT
为0
。COUNT
值,因为%ROWCOUNT
值为0
:ClassMethod Count1() { s myquery = 2 s myquery(1) = "SELECT COUNT(*) AS Recs,COUNT(Name) AS People,$LENGTH(Name) AS NameLen" s myquery(2) = " FROM Sample.Employee WHERE Name %STARTSWITH 'ZZZ'" s tStatement = ##class(%SQL.Statement).%New() s qStatus = tStatement.%Prepare(.myquery) if qStatus'=1 { w "%Prepare failed:" d $System.Status.DisplayError(qStatus) q } s rset = tStatement.%Execute() d rset.%Display() w !,"Rowcount:",rset.%ROWCOUNT }
DHC-APP> d ##class(PHA.TEST.SQLCommand).Count1()
Recs People NameLen
0 Rows(s) Affected
Rowcount:0
COUNT(*)
返回1。%ROWCOUNT
为1。ClassMethod Count2()
{
s myquery = "SELECT COUNT(*) AS Recs"
s tStatement = ##class(%SQL.Statement).%New()
s qStatus = tStatement.%Prepare(myquery)
if qStatus'=1 {
w "%Prepare failed:"
d $System.Status.DisplayError(qStatus)
q
}
s rset = tStatement.%Execute()
d rset.%Display()
w !,"Rowcount:",rset.%ROWCOUNT
}
DHC-APP> d ##class(PHA.TEST.SQLCommand).Count2()
Recs
1
1 Rows(s) Affected
Rowcount:1
可以使用COUNT
(表达式)来计数流字段值,但有一些限制。
COUNT(streamfield)
计算所有非null
值。
它不会检查重复的值。
当expression
是一个流字段时,不能指定COUNT
函数的DISTINCT
关键字。
试图在流字段中使用DISTINCT
关键字会导致SQLCODE -37
错误。
不能在%FOREACH
冒号列表中指定流字段。
尝试这样做会导致SQLCODE -37
错误。
下面的例子显示了COUNT
函数的有效使用,其中Title
是字符串字段,Notes
和Picture
是流字段:
SELECT DISTINCT Title,COUNT(Notes),COUNT(Picture %FOREACH(Title))
FROM Sample.Employee
当Title
为字符串字段,Notes
和Picture
为流字段时,以下示例无效:
-- Invalid: DISTINCT keyword with stream field
SELECT Title,COUNT(DISTINCT Notes) FROM Sample.Employee
-- Invalid: %FOREACH col-list contains stream field
SELECT Title,COUNT(Notes %FOREACH(Picture))
FROM Sample.Employee
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。