功能介绍:
能够实现与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'是维表,C是T'的字段,如果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中对应的维分组。BY和ON全省略时,如果选出字段是全聚集,则全集聚集到一条记录,和普通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 回款日期#年月 |
|
3 |
SELECT 回款单.COUNT(*) 回款笔数 FROM 回款单 BY 回款日期#年月 |
去掉 ON 字段,更贴近SQL的写法,此时基准维为BY子句中用来分组的字段的维;注意,省略ON从句时,如果不在选出字段中指定,基准维默认自动选出 |
4 |
SELECT回款单.COUNT(*) 回款笔数 ON 客户.客户ID, 年月 FROM 回款单 BY fk1.客户ID,回款日期#年月 |
注意 ON 后面的客户.客户ID,ON 后面要求维表名.字段名,所以不能像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后面写维名