同事写了个SQL,发现group by之后总数不对,不用group by查询有26条数据,使用group by查询总数只有16条数据,同事写的sql类似如下:
select t.sec_id,t.type_t,t.prod_id,t.amt_num from tmp_t t group by t.sec_id,t.type_t,t.prod_id,t.amt_num order by t.sec_id,t.type_t,t.prod_id,t.amt_num
看了之后跟同事说group by 之后,amt_num要使用sum,同事一直不相信,只好写个简单的例子,上例子:
with tmp_t as( select '0' as sec_id,'10000001' as type_t,'80008510' as prod_id,1 as amt_num from dual union all select '0','10000001','80008510',1 from dual union all select '0','10000001','80008510',1 from dual union all select '0','10000001','80008510',1 from dual union all select '0','10000002','80008510',1 from dual union all select '0','10000002','80008510',1 from dual)
如上所示,只有2条数据,其他的是重复的。
with tmp_t as( select '0' as sec_id,'10000001' as type_t,'80008510' as prod_id,1 as amt_num from dual union all select '0','10000001','80008510',1 from dual union all select '0','10000001','80008510',1 from dual union all select '0','10000001','80008510',1 from dual union all select '0','10000002','80008510',1 from dual union all select '0','10000002','80008510',1 from dual) select * from tmp_t t order by t.sec_id, t.type_t, t.prod_id, t.amt_num
group by使用sum:
with tmp_t as( select '0' as sec_id,'10000001' as type_t,'80008510' as prod_id,1 as amt_num from dual union all select '0','10000001','80008510',1 from dual union all select '0','10000001','80008510',1 from dual union all select '0','10000001','80008510',1 from dual union all select '0','10000002','80008510',1 from dual union all select '0','10000002','80008510',1 from dual) select t.sec_id,t.type_t,t.prod_id,sum(t.amt_num) from tmp_t t group by t.sec_id,t.type_t,t.prod_id,t.amt_num order by t.sec_id,t.type_t,t.prod_id,t.amt_num
结果如下:
总数是正确的。
group by 不使用sum:
with tmp_t as( select '0' as sec_id,'10000001' as type_t,'80008510' as prod_id,1 as amt_num from dual union all select '0','10000001','80008510',1 from dual union all select '0','10000001','80008510',1 from dual union all select '0','10000001','80008510',1 from dual union all select '0','10000002','80008510',1 from dual union all select '0','10000002','80008510',1 from dual) select t.sec_id,t.type_t,t.prod_id,t.amt_num from tmp_t t group by t.sec_id,t.type_t,t.prod_id,t.amt_num order by t.sec_id,t.type_t,t.prod_id,t.amt_num
结果如下,数量不对:
全文完。
相关推荐
Oracle多行记录合并/连接/聚合字符串的几种方法
本文实例讲述了mysql使用GROUP BY分组实现取前N条记录的方法。分享给大家供大家参考,具体如下: MySQL中GROUP BY分组取前N条记录实现 mysql分组,取记录 GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY...
实际项目中因表数据量大,发现查询速度很慢。记录此次排查和优化过程。希望对阅读到此文章的朋友有所帮助。
delete from people where peopleId in (select peopleId from people group by peopleId having count (peopleId) > 1) and rowid not in (select min(rowid) from people group by peopleId having count(peopleId...
实际项目中因表数据量大,发现查询速度很慢。记录此次排查和优化过程。希望对阅读到此文章的朋友有所帮助。
查询及删除重复记录的SQL语句1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断select * from 表 where Id in (select Id from 表 group by Id having count(Id) > 1)2、删除表中多余的重复记录,...
(环境是sql developer)有一个语句执行很慢,查询出来的结果有17544条记录,但需970秒,速度很慢。语句是这样的: SELECT DISTINCT 'AMEND_NEW', reporttitle, reportsubtitle, cab_cab_transactions.branch...
很详细的oracle教程.... 7.2、子查询空值/多值问题 如果子查询未返回任何行,则主查询也不会返回任何结果 (空值)select * from emp where sal > (select sal from emp where empno = 8888); 如果子查询返回单行结果...
MySQL的group by与Oracle有所不同,查询得字段可以不用写聚合函数,查询结果取得是每一组的第一行记录。 利用上面的特点,可以利用mysql实现一种独特的排序; 首先先按某个字段进行order by,然后把有顺序的表进行...
几个删除重复记录的SQL语句 1.用rowid方法 2.用group by方法 3.用distinct方法 1。用rowid方法
3.3.4 GROUPBY子句 3.3.5 HAVING子句 3.3.6 多表连接查询 3.3.7 集合操作 3.3.8 子查询 3.4 数据操纵 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 3.4.4 TRLINCATE语句 3.5 数据控制 ...
如果在GROUP BY中过滤数据,在WHERE从句中指定条件比在HAVING从句中有更好的性能,因为在GROUP之前已经过滤掉数据,因此更少的行被汇总 3.UNION会对两个SELECT语句的结果集执行一个SORT,并消除重复行,成本会...
select distinct id,name from t1 可以取多个字段,但只能消除这2个字段值全部相同的记录 所以用distinct达不到想要的效果,用group by 可以解决这个问题。 例如要显示的字段为A、B、C三个,而A字段的内容不能重复...
oracle 甲骨文 获得最高认证级别的ISO标准安全认证,性能最高, 保持开放平台下的TPC-D和TPC-C的世界记录。但价格不菲 大型企业 db2 IBM DB2在企业级的应用最为广泛, 在全球的500家最大的企业中,几乎85%以上用DB2...
select owner, object_type, status, count(*) count# from all_objects group by owner, object_type, status; 8、查看数据库的版本 Select version FROM Product_component_version Where SUBSTR(PRODUCT,1,6...
(3)应用 PL/SQL 解决实际问题 【实验内容与步骤】 PL/SQL块中的可执行部分是由一系列语句组成的(包括对数据库进行操作的SQL语句,PL/SQL语言的各种流程控制语句等)。在块中对数据库查询,增、删、改等对数据的...
group by OOD.ORGANIZATION_CODE, OOD.ORGANIZATION_NAME, MSA.SECONDARY_INVENTORY_NAME, MSA.DESCRIPTION, MSIV.SEGMENT1, MSIV.DESCRIPTION, MOQD.LOT_NUMBER, MSIV.MIN_MINMAX_QUANTITY, MSIV.MAX_MIN...
Oracle练习笔试大全 1、select ename, sal * 12 from emp; //计算年薪 2、select 2*3 from dual; //计算一个比较纯的数据用dual表 3、select sysdate from dual; //查看当前的系统时间 4、select ename, sal*12 ...
3.3.4 GROUPBY子句 3.3.5 HAVING子句 3.3.6 多表连接查询 3.3.7 集合操作 3.3.8 子查询 3.4 数据操纵 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 3.4.4 TRLINCATE语句 3.5 数据控制 3.5.1 ...