首页 > 编程知识 正文

sql查询结果分组,sql数据库分组查询语句

时间:2023-05-04 18:30:33 阅读:181815 作者:1137

1. GROUP BY如果有以下表inoutinfo,

statusnumberspend目前是广东省BS812010,已是广东省BS812015,已是广东省BS812020,目前是广东省BS812125,已是广东省BS812130,已是广东省bs 81210

select number as编号、count(* ) as数量from inoutinfoGroup by number测试结果:

解读:1.此语句执行顺序:查询inoutinfo记录-按number分组-输出number和count(* )两个字段;

2 .输出字段必须包括在Group by子句或聚合函数中。 例如,以下语句报告错误:

-错误:选择列表中的列“inoutinfo.spend”无效。 因为此列不在聚合函数或GROUP BY子句的select number as编号、count(*,spend as数from inoutinfoGroup by number中

其实,道理很简单,我们可以根据number小组,分成两组(“粤BS8120”“粤BS8121”),这表明最终只有两个记录。 因此,对于所有输出字段,它们都将显示在Group by子句中以将记录显示在一起,或者使用聚合函数将记录处理为单个值。

常见的聚合函数有: count、sum、avg、max、min;

查询同辆车的进出记录(GROUP BY + 单个字段)

select number编号、状态、sum(spend )费用from inoutinfogroup by number、status测试结果:

解读:1.分组顺序按group by后字段顺序分组。 例如,首先由number分为“粤BS8120”“粤BS8121”,然后由status将前面的每组又分成两组,“出车场”“出车场”:“最终有四组。 “粤BS8120停车场”

2 .为了清楚起见,建议使输出字段的顺序与GROUP BY子句中的字段的顺序一致。

3. GROUP BY之后的字段顺序不影响最终分组结果。

2. GROUP BY ALL在GROUP BY之后加上ALL。 这意味着在对WHERE子句查询的结果集进行分组后,仍将显示由WHERE子句过滤的记录,而由其他聚合函数聚集的数据将显示0或NULL。

select number编号、count(* )数量、sum ) spend )费用from inoutinfowhere number='粤BS8120'group by all number测试结果:

解读:由于1. where子句在group by子句之前执行,因此粤BS8121的记录在分组之前已过滤,但仍显示在结果集中。 但是,对应的数量和费用显示为0和NULL。

3 .在3. GROUP BY WITH CUBE GROUP BY之后添加CUBE运算符的结果集,除了GROUP BY组统计的结果集之外,还添加了汇总各个单独字段和相互混合字段的多维交叉结果集。 让我举几个例子来说明。

查询同辆车的不同状态下的进出记录(GROUP BY + 多个字段)

选择编号、计数(* )数frominoutinfogroupbynumberwithcube测试结果:

解读:1.与没有在中间放CUBE的结果集比较,发现记录(NULL,6 )增加了。 这就是总结编号这个字段后,统计得到的记录。 这里的总结称为“小计”,用NULL填充。

2 .实际上上面的空值很容易混淆统计数据中包含的空值,所以可以使用grouping函数解决这个问题。 grouping作用于总结的NULL,返回1,作用于查询得到的NULL,返回0。 修改后的代码如下。

selectcasewhen(grouping(number )=1) then '小计) else numberend牌照,count(* )数frominoutinfogroupbynumberwithcube

单个字段的分组查询

选择编号、状态、计数(* )数from inoutinfogroup by number、status with cube测试结果:

解读:1.从前面可以看出,GROUP BY组生成四条记录,与上图的1、2、4、5相对应。 通过汇总车牌,总结得到3和6两个记录的状态,得到8和9两个记录;通过总结车牌和状态,得到7个记录

2. GROUP BY之后的字段顺序不影响分组结果。

4. GROUP BY WITH ROLLUP ROLLUP与CUBE的作用相同,基于GROUP BY进一步汇总统计数据,但ROLLUP比CUBE的局限性更多。 由于不是将所有字段混合在一起,而是根据GROUP BY后面的字段的顺序,从高级别字段到低级别的字段进行分组,因此GROUP BY后面的字段的顺序会影响分组的结果。

选择编号、状态、计数(* )数from inoutinfogroup by number、status with rollup测试结果:

解读:1.与上面的结果比较,发现结果集减少了2件。 这是因为没有汇总车牌下不同状态的统计数据。 根据字段的等级,由于status在number字段之后,status字段的等级高于number,所以先把status字段汇总起来,得到3和6两个记录,然后根据3和6进行编号

5. GROUP BY和HAVING、WHERE、ORDER BY一起使用select number、status、count(* )的数,进行sum ) spend ) totalfrominoutinfo2wherestasts

解读:1.这四种执行顺序: where group by having order by;

2.where在group by之前执行,因此where子句不能包含聚合函数,但可以是having;

3. having用于过滤分组结果集,因此无法使用输出字段的别名进行确定。 执行order by后,结果集查询完成,因此order by可以使用输出字段别名进行排序。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。