今天需要这样一句sql:先用group by进行分组,然后利用聚合函数count 或者sum进行计算,并显示其它的辅助信息。
在mysql环境中,我模拟如下环境:
Mysql中语句如下:
select count(u.username),r.rname,r.rid,r.pid
from room r,user1 u
where r.pid=u.id 
group by r.rid,r.pid
这里r.rname并没有出现在group by子句、聚合函数中,但是MYSQL中仍然能够执行、列出数据。
但是,在ORACLE中,却不能!!!!
Oracle环境中:
/* 
 --显示:Ora-00979 not a ORDER BY expression
 --因为: order by 后边的c.channel_code不在ORDER BY子句中
 select count(c.channel_name),m.media_name
  from channel c,media m
  where c.media_code = m.media_code
 group by c.media_code,m.media_name
 order by c.channel_code 

--显示:Ora-00979 not a GROUP BY expression
--因为:group by 或者聚合函数中没有包含c.channel_name
 select count(c.channel_name),m.media_name,c.channel_name
  from channel c,media m
  where c.media_code = m.media_code
 group by c.media_code,m.media_name
  */
--通过:
select count(c.channel_name),m.media_name
  from channel c,media m
  where c.media_code = m.media_code
 group bym.media_name
--正常
select count(c.channel_name),m.media_name
  from channel c,media m
  where c.media_code = m.media_code
 group by c.media_code,m.media_name

--正常
select count(c.channel_code),m.media_name
  from channel c,media m
  where c.media_code = m.media_code
 group by c.media_code,m.media_name

 
 
CREATE TABLE `room` (                     
          `rid` varchar(5) default NULL,          
          `rname` varchar(5) default NULL,        
          `pid` int(11) default NULL,             
          `seq` int(11) NOT NULL auto_increment,  
          PRIMARY KEY  (`seq`)                    
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8   
房间表,seq房间入住序号(主键),rname为房间名,这里不考虑第三范式
情景:人住房间,
统计某个房间某个人住的次数
 
用户表,客人的信息
CREATE TABLE `user1` (                   
          `ID` int(11) NOT NULL auto_increment,  
          `USERNAME` varchar(50) default '',     
          `PASSWORD` varchar(50) default '',     
          PRIMARY KEY  (`ID`)                    
        ) ENGINE=InnoDB DEFAULT CHARSET=gbk
 
 
总结如下:
注:oracle常用分组函数:
COUNT、AVE、SUM、MAX、MIN
Count(*):返回表中所有的行包括空行和重复的行。
COUNT(表达式)返回表中所欲哦表达式为空的行。例如:select count(mgr) from emp; 返回表中所有mgr为非空的行。
Max、min可用于:数字型数据、字符型数据和日期型数据。
!!!!除了Count(*)外,其他的分组函数都不处理空值(NULL)
比如Max求出的“最大值”就不是null,尽管select的结果(按照从小到大到达顺序)null排在最后的位置。
如果在一个查询中使用了分组函数,任何不在分组函数的列或表达式必须在GROUP BY子句中。
 
网友总结:
select ……group by的时候,前面的select的字段,要么是group by的依据,要么是聚合内容。
我理解下:
Select中的字段,只能包含在聚合函数中(e.g:min(price)),或是包含在group by子句中,否则在oracle等数据库中就会报Ora-00979 not a ORDER BY expression错误。
 
在求平均值的时候,计算出的avg值会偏大,因为总数中没有计算含有null值所在的数据行。
这时可以使用NVL函数进行空值转换。
 
格式:NVL(表达式1,表达式2)
说明:如果表达式1 为空值(NULL),NVL返回值为表达式2的值,否则返回表达式1的值。
表达式1和表达式2可以是数字型、字符型或日期型,但表达式1和表达式2的数据类型必须一致。
如:
l          对于日期型:NVL(hiredate,’31-DEC-99’)
l          对于数字型:NVL(comm,0)
对于字符型:NVL(TO_CHAR(comm),’No Commission’)