分组汇总

阅读(2434) 标签: on, having,

功能介绍:

能够实现与SQL分组同样的功能,但写法更加简洁

语法描述:

SELECTT.f(...),......, T.F#L',......, ON T'.C AS D

FROMT WHERE…BY T.F#L.....

HAVING…..

参数说明:

T.f(...)

聚合函数

T.F#L'

T的字段F的层函数L'不能低于分组维L

ON T'.C

设定基准维,T'是维表,CT'的字段,如果C是唯一的关键字段,C可以省略;如果是单表时,ON T'.C可以省略;如果元数据中已定义了维名,则T'.C可以用维名代替,写起来更简单,ON省略按照BY中字段对应维分组。特别注意:当有多个基准维时,要么不写ON全不设定,要么必须写全,不能只设定一部分基准维

AS D

T'.C的别名,可省略

BY T.F#L

分组字段,必须是维字段,分组字段按照对应的维进行分组。每个分组字段,系统会从ON中找到字段的维,或者能通过层间表达式换算来的维,此时,ON中的一个维只能对应同一个BY后的一个字段,不同的BY则从头开始对应。如果ON中用多个同维的字段,则按顺序找到第一个对应的维即止。因此,如果按照顺序导致某些BY字段找不到对应的维或者因为存在多个同维的而对应错,则要通过别名指定。BY省略ON不省略相当于用维的主键按照ON中对应的维分组。BYON全省略时,如果选出字段是全聚集,则全集聚集到一条记录,和普通SQL相同。

HAVING

后面写分组后的过滤条件

举例:

1

SELECT 回款单.COUNT(*) 回款笔数

ON 客户.客户ID

FROM 回款单

BY 客户ID

分客户统计回款笔数,ON子句中的基准维通常写作维表.维,如果定义了维名,也可以使用维名

2

SELECT

客户ID.客户名称,

回款单.COUNT(*) 回款笔数

FROM 回款单

BY 客户ID

去掉ON子句,更贴近SQL的写法

3

SELECT 回款单.COUNT(*)回款总笔数

FROM 回款单

计算所有回款笔数

4

SELECT 回款单.COUNT(*) 回款笔数

ON 客户

FROM 回款单

BY 客户ID

按“回款单”表的“客户ID”外键进行分组,ON后面指定基准维为“客户”维,此时元数据中需要定义维名:客户=客户.客户ID;但是,由于客户表只有一个主键客户ID,因此,即使未定义维名,在指定基准维时,也可以用维表名客户来代替维

 

1

SELECT 回款单.COUNT(*) 回款笔数

ON .年月

FROM 回款单

BY 回款日期#年月

分月份统计回款笔数,注意ON后面的写法是表.字段

2

SELECT回款单.COUNT(*) 回款笔数

ON 年月

FROM 回款单

BY 回款日期#年月

ON后面只写维名,之所以可以这样写是因为在元数据定义中我们定义了维名:年月=.年月

 

 

 

 

 

 

3

SELECT

回款单.COUNT(*) 回款笔数

FROM 回款单

BY 回款日期#年月

去掉 ON 字段,更贴近SQL的写法,此时基准维为BY子句中用来分组的字段的维;注意,省略ON从句时,如果不在选出字段中指定,基准维默认自动选出

4

SELECT回款单.COUNT(*) 回款笔数

ON 客户.客户ID, 年月

FROM 回款单

BY fk1.客户ID,回款日期#年月

注意 ON 后面的客户.客户IDON 后面要求维表名.字段名,所以不能像BY后面那样写外键名.字段名

5

SELECT

fk1.客户ID,回款日期#年月,

回款单.COUNT(*) 回款笔数

FROM 回款单

BY fk1.客户ID,回款日期#年月

去掉 ON 字段,更贴近SQL的写法

 

1

SELECT 回款日期#年月,回款单.COUNT(*) 回款笔数

FROM 回款单

BY 回款日期#年月

HAVING COUNT(*) <10

HAVING 后面的最后选出条件表达式中,字段要使用原名,不能使用别名

2

SELECT

fk1.结束时间#年月,回款日期#年月,

回款单.COUNT(*) 回款笔数

FROM 回款单

WHERE fk1.结束时间#年月IN (201210,201211)

BY fk1.结束时间#年月, 回款日期#年月

HAVING 回款单.COUNT(*) < ?

HAVING中也可以像WHERE中一样使用参数

知识点:

1) 分组字段只能是维字段

2) ON后面指定基准维的格式为维表名.字段名,或者主表名.字段名,有两种方式可以进行简写,第一种就是所引用的字段是维表的主键,并且是单一主键的形式,在这种情况下,可以在ON后面直接写维表名,而不必写字段名。第二种是指在元数据“维和层”中定义了维名的话,也可以直接在ON后面写维名