oracle 中GROUP BY的用法

oracle 中GROUP BY的用法


问题:

select item.itemnum,item.in1,item.in4,inventory.location from item,inventory

where item.itemnum=inventory.itemnum

and inventory.location='DYB'

and item.in1='D/MTD/MRM'

GROUP BY ITEM.ITEMNUM

提示错误是NOT A GROUP BY EXPRESSION

答案:

GROUP BY 是分组查询, 一般 GROUP BY 是和 聚合函数配合使用,你可以想想

你用了GROUP BY 按 ITEM.ITEMNUM 这个字段分组,那其他字段内容不同,变成一对多又改如何显示呢,比如下面所示

A B

1 abc

1 bcd

1 asdfg

select A,B from table group by A

你说这样查出来是什么结果,

A B

    abc

1 bcd

    asdfg

右边3条如何变成一条,所以需要用到聚合函数,比如

select A,count(B) 数量 from table group by A

这样的结果就是

A 数量

1 3

group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面

讨论:mysql和oracle对group by的解析是不一样的!

mysql:

SELECT s.SName, sc.COUNT(CID) c
FROM SC sc JOIN S s ON sc.SID = s. SID
GROUP BY s.SID
HAVING c = ( SELECT COUNT(*) FROM C )

oracle:

SELECT s.SID, s.SName, sc.COUNT(CID) c
FROM   SC sc JOIN S s ON sc.SID = s.SID
GROUP BY s.SID, s.SName
HAVING c = ( SELECT COUNT(*) FROM C )


大家可以看到区别了,mysql对group by子句的限制有所放宽,除了集合函数之外的被查询字段也可以不参与分组。相反oracle则是严格要求,所以感觉mysql似乎更灵活一些。
欢迎大家批评指正



http://blog.youkuaiyun.com/basenet855x/article/details/6694150

### OracleGROUP BY 的使用方法 #### 基本概念 `GROUP BY` 是 SQL 查询语句的一部分,用于将具有相同值的行分组在一起。它通常与聚合函数一起使用,例如 `SUM()`、`COUNT()`、`AVG()` 等,以便对每一组数据执行计算并返回单个结果。 在 Oracle 数据库中,`GROUP BY` 子句允许开发者按指定的一列或多列进行分组,并针对每组生成统计数据[^1]。 --- #### 语法结构 以下是标准的 `GROUP BY` 语法: ```sql SELECT 列名1, 聚合函数(列名2), ... FROM 表名 WHERE 条件表达式 GROUP BY 列名1; ``` 注意:`GROUP BY` 后面列出的字段必须是非聚合字段,而其他未出现在 `GROUP BY` 子句中的字段则需通过聚合函数处理[^3]。 --- #### 示例说明 假设有一个名为 `sales` 的表,其结构如下: | id | product_name | sale_date | amount | |----|--------------|-----------|--------| | 1 | Apple | 2023-01-01| 10 | | 2 | Banana | 2023-01-01| 20 | | 3 | Apple | 2023-01-02| 15 | ##### 示例 1:基本分组查询 如果想按照产品名称 (`product_name`) 对销售金额 (`amount`) 进行求和,则可以编写以下查询: ```sql SELECT product_name, SUM(amount) AS total_amount FROM sales GROUP BY product_name; ``` 这会得到每个产品的总销售额。 | product_name | total_amount | |--------------|--------------| | Apple | 25 | | Banana | 20 | --- ##### 示例 2:带条件过滤的分组查询 可以通过 `WHERE` 子句进一步筛选符合条件的数据后再进行分组操作。例如,仅统计日期为 `'2023-01-01'` 的记录: ```sql SELECT product_name, SUM(amount) AS total_amount FROM sales WHERE sale_date = '2023-01-01' GROUP BY product_name; ``` 此查询的结果将是只包含当天的产品及其对应的总额。 | product_name | total_amount | |--------------|--------------| | Apple | 10 | | Banana | 20 | --- #### 高级用法:ROLLUP 功能 当需要生成多级别的汇总信息时,可利用 `ROLLUP` 扩展 `GROUP BY` 的能力。例如,在上述例子基础上增加整体总计的功能: ```sql SELECT product_name, SUM(amount) AS total_amount FROM sales GROUP BY ROLLUP(product_name); ``` 运行该查询后不仅会有各产品的具体合计数,还会额外附加一条表示所有商品加总的记录[^2]。 | product_name | total_amount | |--------------|--------------| | Apple | 25 | | Banana | 20 | | NULL | 45 | 这里的最后一项 `(NULL)` 即代表总体的小计数值。 --- #### 特殊场景:时间维度上的分组 有时可能希望基于特定时间段(比如月份)来进行分析。此时可通过字符串截取或者日期函数实现自定义的时间粒度转换。下面展示如何提取某一年份内的每月销量情况: ```sql SELECT TO_CHAR(sale_date, 'YYYY-MM') AS month, SUM(amount) AS monthly_total FROM sales WHERE EXTRACT(YEAR FROM sale_date) = 2023 GROUP BY TO_CHAR(sale_date, 'YYYY-MM') ORDER BY month ASC; ``` 这段脚本能帮助我们查看整个年度内每个月的具体表现状况。 --- ### 总结 以上介绍了 Oracle 数据库中关于 `GROUP BY` 的基础应用以及一些高级技巧。无论是简单分类还是复杂嵌套总结需求都可以借助这一工具完成高效的数据挖掘工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值