同样的sql在mysql运行没有问题,在oracle会报不是group by表达式的错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同样的sql在mysql运行没有问题,在oracle会报不是group by表达式的错相关的知识,希望对你有一定的参考价值。

这是sql语句 select a.app_name as dealInfoId,SUM(CASE WHEN l.ser_type='日常客服' then 1 else 0 end) as rc,SUM(CASE WHEN l.ser_type='温馨提示' then 1 else 0 end) as wx,SUM(CASE WHEN l.ser_type='更新提示' then 1 else 0 end) as gx,SUM(CASE WHEN l.ser_type='回访' then 1 else 0 end) as hf,SUM(CASE WHEN l.ser_type='培训' then 1 else 0 end) as px FROM work_info_log l,config_app a where l.config_app = a.id and l.office_id in (34,500201) group by l.config_app。
各位大婶求解答啊

oracle和mysql,group by是由区别的。

oracle的gruop by 后跟的必须是select查询出的字段

而且group by语句中select指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包含在聚合函数中

聚合函数比如:

sum(列名)       求和            

max(列名)       最大值            

min(列名)        最小值            

avg(列名)       平均值            

count(列名)    统计记录数    注意和count(*)的区别


select a.app_name as dealInfoId,
       SUM(CASE
             WHEN l.ser_type = '日常客服' then
              1
             else
              0
           end) as rc,
       SUM(CASE
             WHEN l.ser_type = '温馨提示' then
              1
             else
              0
           end) as wx,
       SUM(CASE
             WHEN l.ser_type = '更新提示' then
              1
             else
              0
           end) as gx,
       SUM(CASE
             WHEN l.ser_type = '回访' then
              1
             else
              0
           end) as hf,
       SUM(CASE
             WHEN l.ser_type = '培训' then
              1
             else
              0
           end) as px
  FROM work_info_log l, config_app a
 where l.config_app = a.id
   and l.office_id in (34, 500201)
 group by a.app_name;

 

参考技术A SELECT A.APP_NAME AS DEALINFOID,
SUM(CASE
WHEN L.SER_TYPE = '日常客服' THEN
1
ELSE
0
END) AS RC,
SUM(CASE
WHEN L.SER_TYPE = '温馨提示' THEN
1
ELSE
0
END) AS WX,
SUM(CASE
WHEN L.SER_TYPE = '更新提示' THEN
1
ELSE
0
END) AS GX,
SUM(CASE
WHEN L.SER_TYPE = '回访' THEN
1
ELSE
0
END) AS HF,
SUM(CASE
WHEN L.SER_TYPE = '培训' THEN
1
ELSE
0
END) AS PX
FROM WORK_INFO_LOG L, CONFIG_APP A
WHERE L.CONFIG_APP = A.ID
AND L.OFFICE_ID IN (34, 500201)
GROUP BY L.CONFIG_APP,A.APP_NAME
你看这样对了没 没对报的什么错

怎么将oracle的sql文件转换成mysql的sql文件

您好,首先需要这两个软件:PowerDesigner软件,oracle数据库。 1、将要导入的库的所有表的表结构(不要表数据,只要表结构)导出成一个.sql文件。 2、在PowerDesinger里找到 File -->> Reverse Engineer --->> Database 参考技术A 转换一般会遇到的问题:
1 、 大小写敏感的区别( 如果服务器 OS 是linux) 。
在oracle 中一般情况下不区分大小写。有时候我们在使用oracle 不注意大小写的问题,表名和字段名不加双引号是不区分大小写的,像这样:insert into tableName 和 insert into TABLENAME 效果是一样的,用工具导出创建/ 数据初始化脚本,得到的结果一般表名和字段名转化成了大写。
但在MySQL 中,所使用操作系统 的大小写敏感性决定了数据库名和表名的大小写敏感性。数据库对应数据目录中的目录,数据库中的每个表至少对应数据库目录中的一个文件( 也可能是多个,取决于存储引擎) 。因此,使用数据库或表实际上是操纵这些文件( 夹) ,所以使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。在以linux 为内核的操作系统中是大小写敏感的。
解决的办法是把mysql 的数据库名和oracle 的大小写保持一致,表名与应用程序中sql 字符串中的表名保持一致,如果应用程序中字段名用了双引号,那请把sql 中的字段名大小写与双引号里的字符保持一致。如果你的应用程序所引用的表名、字段没有统一大小写,那麻烦就大了。
2 、保留字的区别。
像sql 语言的函数名( 如:inteval ,show) 等是保留字。Oracle 中保留字是可以作为表名和字段名,并且不影响使用,但mysql 中保留字是不能作为表名和字段名,如果使用会报语法错误。
解决办法,把sql 语句中的保留字用‘`’ 符号引起来,这个符号位于键盘 的tab 键上面; 如果是字段名还有另外一种方法tablename. 字段名。像这样:insert into tablename (id, `interval`) value(….. 或insert into tablename (id, tablename.inteval) value(….. 。
3 、数据类型的区别。
在mysql 中没有像oracle 中的varchar2 、number ,mysql 有与之对应的varchar 、numeric ,当然在oracle中没有mysql 的time 类型。
解决办法是替换。
4 、自动增长类型的区别。
Oracle 有sequence ,mysql 中没有,但有auto_increment 属性。
解决办法是把Oracle 中sequence 转换成使用auto_increment 属性,某些情况可能还有一种办法可以解决问题,新建一个独立的表用来专门记录自动增长型的数据。
5 、索引长度限制的区别。
从MySQL 4.1.2 开始,MyISAM 和InnoDB 表索引长度支持1000 字节,也就是说索引字段的长度不能超过1000 字节,如果超过会报错:ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes 。如果是UTF-8 编码,相当于333 个字符的长度( 因为UTF8 一个字符占3 个字节) 。Oracle 的索引长度限制比mysql 要宽松得多。解决办法要么改索引的定义,要么改字段的定义长度。
6、SQL中函数名称不一致
可以在网上找oracle 常用函数 与mysql 的对照表,然后逐一修改。网上也可以找到简单的转换工具,效果自己判断。本回答被提问者采纳

以上是关于同样的sql在mysql运行没有问题,在oracle会报不是group by表达式的错的主要内容,如果未能解决你的问题,请参考以下文章

Oracle在查询Sql中不使用order by,导致数据量足够大的时候同样的sql查询的结果顺序不同?

在SQL / Oracle中级联

怎么将oracle的sql文件转换成mysql的sql文件

sql server 2008 链接 ORACLE 问题

MySQL sql-mode

mysql的sql执行计划详解