同事写了个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
结果如下,数量不对:
全文完。
相关推荐
使用`MODEL`指令需要对Oracle SQL有深入理解,但能解决一些其他方法无法处理的复杂问题。 在实际应用中,选择哪种方法取决于具体的需求、数据结构以及Oracle数据库的版本。例如,如果只需要简单的字符串连接,`...
本文实例讲述了mysql使用GROUP BY分组实现取前N条记录的方法。分享给大家供大家参考,具体如下: MySQL中GROUP BY分组取前N条记录实现 mysql分组,取记录 GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY...
### 处理GROUP BY 查询速度慢的问题 ...综上所述,通过合理设计索引策略,可以有效解决GROUP BY查询速度慢的问题。此外,通过持续的性能监控和测试,还可以不断优化数据库性能,确保系统的高效运行。
Oracle中的`GROUP BY`语句是SQL查询中的关键部分,用于根据一个或多个列对数据进行分组,以便对每个组执行聚合函数,如`SUM`、`COUNT`、`AVG`等。在本例中,我们看到的`GROUP BY`语句是用来对`test`表中的数据进行...
在Oracle 11g Release 2数据库管理系统中,掌握分组查询GROUP BY、模糊查询LIKE、连接查询JOIN以及IN()和NOT IN()等查询技术是至关重要的,它们为数据分析师和开发人员提供了强大的数据筛选与汇总能力。以下是对这些...
通过记录和优化过程,总结出一些有价值的经验,希望能够帮助读者解决类似的问题。 知识点1:Group By 查询的索引设置 在优化 Group By 查询时,仅对 Group By 字段设置索引是不够的。需要将聚合函数(如 min、max ...
通过分析SQL执行计划,检查表的统计信息,以及调整数据库参数,都可以帮助找到并解决问题。 总的来说,解决Oracle性能问题是一个涉及多方面步骤的过程,包括诊断、定位、优化和验证,需要综合运用各种工具和技术,...
在SQL查询中,`order_by_`、`group_by_`和`having`是三个非常重要的关键字,它们分别用于不同的数据处理操作。 1. `ORDER BY`:此关键字用于对查询结果进行排序,默认是升序(ASC),也可以指定降序(DESC)。在`...
总结来说,Oracle提供了强大的查询和删除功能来处理重复记录的问题。通过`GROUP BY`和`HAVING`子句,我们可以对数据进行分组并过滤出重复的行,而`ROWID`则作为确定保留哪条记录的标准。在处理大规模数据时,这些...
在Oracle数据库中,有时我们需要将多个字段值转换为单个字符串,或者将多行记录合并成一行,这在数据处理和报告生成时尤其常见。Oracle提供了多种方法来实现这一目标,包括使用内置函数、PL/SQL过程以及一些高级特性...
### Oracle中如何删除重复的记录 在Oracle数据库中,数据的完整性是非常重要的。有时,由于各种原因(如数据导入错误、系统故障等),数据库表中可能会出现重复的记录,这不仅浪费存储空间,还可能导致查询结果不...
在描述中提到的问题中,当使用`ORDER BY`对包含非唯一值的列进行排序,并结合分页查询时,发现不同页码的数据可能会有重复。这进一步证实了`ORDER BY`在Oracle中的不稳定特性。在没有唯一索引或主键约束的情况下,...
查询及删除重复记录的SQL语句1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断select * from 表 where Id in (select Id from 表 group by Id having count(Id) > 1)2、删除表中多余的重复记录,...
- `(SELECT CONTRACTID, MIN(ALTER_DATE) AS ALTER_DATE FROM AGENT_CHANGE_TABLE GROUP BY CONTRACTID)`:这部分代码的功能是基于`CONTRACTID`分组,为每一组选出最早的`ALTER_DATE`时间,并将这些信息作为临时表`...
使用Oracle查询并删除重复记录的SQL语句 在实际应用中,删除重复记录是非常常见的操作,特别是在数据导入、数据整合和数据清洁等场景中。Oracle数据库提供了多种方式来查询和删除重复记录,本文将详细介绍这些方法...
为解决这个问题,本文将介绍如何使用 Oracle 查询重复数据并删除,只保留一条记录。 一、重复记录根据单个字段来判断 在 Oracle 中,我们可以使用 GROUP BY 语句来查找重复记录。假设我们要根据 FIELD_CODE 字段来...
`GROUP BY`子句用于结合`SELECT`语句,将来自同一个表的多条记录分组为一组或多组。通常情况下,`GROUP BY`会与聚合函数一起使用,如`COUNT()`、`SUM()`、`AVG()`等,以便对每个分组的数据进行统计或计算。 #### 二...
在Oracle中,可以使用`GROUP BY` 和 `HAVING` 子句来实现这个功能。假设我们有一个`users`表,想要找出所有重复的邮箱地址,可以编写以下查询: ```sql SELECT email, COUNT(*) as count FROM users GROUP BY email...