Oracle汇总

1.批量操作

1.1.批量添加

<insert id="batchInsert">
insert into USER
(
	ID,NAME,AGE,CREATETIME
)
select SEQ_ID.NEXTVAL,a.*
from (
<foreach collection="users" item="user" separator="union all">
	select
		#{user.name,jdbcType=VARCHAR},
		#{user.age,jdbcType=INTEGER},
		sysdate
	from dual
</foreach>
) a
</insert>

补充知识:
MyBatis会将参数自动转换成数据库对应的类型,但当传入的参数为null时,类型转换出错,此时我们需要手动指定转换类型用到jdbcType,通常我们不会去判断某个参数是否为空,因此所有参数都手动添加指定类型。

1.2.批量删除

<delete id="batchDel">
delete from USER
where (id1,id2) in (
	select id1,id2 from
	(
	<foreach collect="users" item="user" separator="union all">
	select
		#{user.id1,jdbcType=VARCHAR},
		#{user.id2,jdbcType=VARCHAR}
	from dual
	</foreach>
	)
)
</delete>

2.特殊需求

2.1.横向转纵向

<select id="getExceptionScale" resultType="...">
    select EXTRACTVALUE(VALUE(X), '/row') name, count(1) value
    from (select '&lt;rows>' ||
    regexp_replace('&lt;row>' || replace(k.bked13, ';', '&lt;/row>&lt;row>'),
        <![CDATA['</row><row>$',]]>
        '&lt;/row>') || '&lt;/rows>' as data
    from kes5 k
    LEFT JOIN medical_js mj
    on k.BAZ506 = mj.BAZ506 and k.BKE139 = mj.BKE139
    where k.bked13 is not null and mj.AAA131 = '0'
    <if test="kes5DTO.akb020 != null and kes5DTO.akb020 != ''">
        and k.AKB020 = #{kes5DTO.akb020,jdbcType=VARCHAR}
    </if>
    <if test="kes5DTO.aae036 != null and kes5DTO.aae036 != ''">
        and substr(to_char(mj.AAE036, 'yyyy-mm-dd HH24:mi:ss'),0,7) = #{kes5DTO.aae036,jdbcType=VARCHAR}
    </if>
    ) t,
    XMLTABLE('/rows/row' PASSING xmltype(t.data)) x
    group by EXTRACTVALUE(VALUE(X), '/row')
    order by value desc
</select>

2.2.纵向转横向(网上例子)

NO name KM CJ
001 张三 语文 80
001 张三 数学 86
001 张三 英语 75
002 李四 语文 78
002 李四 数学 85
002 李四 英语 78

select decode(grouping(name),1,'总分',name) 姓名, 
	sum(decode(km, '数学',cj,0)) 数学,
	sum(decode(km, '英语',cj,0)) 英语, 
	sum(decode(km, '语文',cj,0)) 语文,
	sum(cj) 总成绩 
from test group by rollup(name)

纵转横结果:
姓名 数学 英语 语文 总成绩
李四 85 78 78 241
张三 86 75 80 241
总分 171 153 158 482

3.不同表之间数据比对

在这里插入图片描述

需求:查找 用户表user和雇员表employee中 既是客户又是雇员的人员信息

select * 
from user u
where EXISTS
(
	SELECT 1
	from employee e
	where
		u.user_id = e.employee_id
		and u.user_name = e.employee_name
		and u.age = e.age
)

++++++++++++++++++++++++++++++++
未完待续
++++++++++++++++++++++++++++++++

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Oracle向上汇总是指使用SQL语言中的GROUP BY子句和聚合函数(如SUM、AVG、MAX等)来将数据按照某些列进行分组,并计算每组的汇总值。这个过程可以帮助我们更好地理解和分析大量数据,并从中获取有用的信息。 例如,假设我们有一个包含销售数据的表,其中包含了订单号、产品名称、销售日期、销售数量和销售金额等字段。我们可以使用以下SQL语句来进行向上汇总,以计算每个产品的销售总量和销售总额: ``` SELECT 产品名称, SUM(销售数量) AS 销售总量, SUM(销售金额) AS 销售总额 FROM 销售表 GROUP BY 产品名称; ``` 执行以上SQL语句后,我们会得到一个结果集,其中每一行代表一个产品的销售汇总信息,包括产品名称、销售总量和销售总额等字段。这些汇总信息可以帮助我们更好地了解每个产品的销售情况,并作出相应的决策。 ### 回答2: Oracle向上汇总是指在数据库查询中使用聚合函数对数据进行汇总和统计的操作。聚合函数是一种用于计算和统计数据值的函数,它们可以对数据进行求和、计数、平均值、最大值、最小值等操作。通过使用聚合函数,我们可以从数据库中获取汇总信息而不是单个数据行。 Oracle提供了多种聚合函数,包括SUM、COUNT、AVG、MAX和MIN等。这些聚合函数可以针对特定的列或表达式进行运算。例如,我们可以使用SUM函数对一个数字列进行求和,使用COUNT函数计算某个列或表达式中的行数。 在使用聚合函数时,我们可以通过使用GROUP BY语句将数据按照特定的列进行分组,然后在每个组内进行聚合操作。这样可以得到每个组的汇总结果。同时,我们还可以通过使用HAVING子句来筛选特定的组。 当我们在Oracle数据库中进行数据分析和统计时,通过向上汇总,我们可以从原始数据中提取出更有意义的信息。例如,我们可以计算某个销售区域的总销售额,或者某个时间段内的平均订单量。这些汇总信息可以帮助我们做出更准确的决策和分析。 总之,Oracle向上汇总是一种利用聚合函数对数据进行统计和汇总的操作,它可以帮助我们从原始数据中提取出更有意义的信息,并进行数据分析和决策。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值