Oracle关于Group by合计、小计的使用

方法:group by rollup(col1,col2)

group by cube(col1,col2)

具体例子:

 select G_GOODS_OUT.DEPTID,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '01', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_01,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '02', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_02,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '03', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_03,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '04', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_04,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '05', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_05,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '06', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_06,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '07', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_07,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '08', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_08,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '09', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_09,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '10', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_10,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '11', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_11,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '12', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_12,
  sum(G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE) YEAR_SUM
  from G_GOODS_OUT
  inner join G_GOODS ON G_GOODS.ID=G_GOODS_OUT.GOODS_ID
  where 1=1 and (G_GOODS_OUT.ACTDATE>=to_date('2013-01-01 00:00:01','yyyy-MM-dd hh24:mi:ss') and G_GOODS_OUT.ACTDATE<=to_date('2013-12-31 23:59:59','yyyy-MM-dd hh24:mi:ss'))
  group by ROLLUP(G_GOODS_OUT.DEPTID)

统计结果:

部门ID一月二月三月四月五月六月七月八月九月十月十一月十二月合计
112345678910111278
 12345678910111278

例子2:

select G_GOODS_OUT.DEPTID,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '01', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_01,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '02', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_02,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '03', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_03,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '04', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_04,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '05', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_05,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '06', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_06,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '07', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_07,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '08', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_08,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '09', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_09,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '10', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_10,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '11', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_11,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '12', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_12,
  sum(G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE) YEAR_SUM
  from G_GOODS_OUT
  inner join G_GOODS ON G_GOODS.ID=G_GOODS_OUT.GOODS_ID
  where 1=1 and (G_GOODS_OUT.ACTDATE>=to_date('2013-01-01 00:00:01','yyyy-MM-dd hh24:mi:ss') and G_GOODS_OUT.ACTDATE<=to_date('2013-12-31 23:59:59','yyyy-MM-dd hh24:mi:ss'))
  group by CUBE(G_GOODS_OUT.DEPTID)

结果与上述的相似

例子:关于grouping的使用

select (case when grouping(G_GOODS_OUT.DEPTID)=1 then '合计' else cast(G_GOODS_OUT.DEPTID as varchar(20)) end ) DEPTID,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '01', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_01,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '02', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_02,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '03', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_03,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '04', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_04,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '05', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_05,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '06', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_06,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '07', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_07,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '08', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_08,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '09', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_09,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '10', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_10,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '11', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_11,
  sum(decode(to_char(G_GOODS_OUT.ACTDATE,'MM'), '12', G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE,null)) as MONTH_12,
  sum(G_GOODS_OUT.SQNUM*G_GOODS.U_PRICE) YEAR_SUM
  from G_GOODS_OUT
  inner join G_GOODS ON G_GOODS.ID=G_GOODS_OUT.GOODS_ID
  where 1=1 and (G_GOODS_OUT.ACTDATE>=to_date('2013-01-01 00:00:01','yyyy-MM-dd hh24:mi:ss') and G_GOODS_OUT.ACTDATE<=to_date('2013-12-31 23:59:59','yyyy-MM-dd hh24:mi:ss'))
  group by CUBE(G_GOODS_OUT.DEPTID)

结果为:

部门ID一月二月三月四月五月六月七月八月九月十月十一月十二月合计
112345678910111278
合计12345678910111278
grouping(col1)的结果为1表示是合计结果,否则是普通聚合结果


注:其实sql Server也是支持group by rollup与group by cube 语法的

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
后面继续更新----


### 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、付费专栏及课程。

余额充值