第三章 SQL聚合函数 COUNT(一)

2021-12-24  本文已影响0人  Cache技术分享

第三章 SQL聚合函数 COUNT(一)

返回表或指定列中的行数的聚合函数。

大纲

COUNT(*)

COUNT([ALL | DISTINCT [BY(col-list)]] expression [%FOREACH(col-list)] [%AFTERHAVING])

参数

COUNT返回BIGINT数据类型。

描述

COUNT聚合函数有两种形式:

COUNT可以在引用表或视图的SELECT查询或子查询中使用。
COUNT可以在SELECT列表或HAVING子句中与普通字段值一起出现。

COUNT不能用于WHERE子句。
COUNT不能在JOINON子句中使用,除非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返回0NULL,这取决于查询:

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
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
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是字符串字段,NotesPicture是流字段:

SELECT DISTINCT Title,COUNT(Notes),COUNT(Picture %FOREACH(Title))
FROM Sample.Employee
image.png

Title为字符串字段,NotesPicture为流字段时,以下示例无效:

-- 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
上一篇下一篇

猜你喜欢

热点阅读