SQL在DBA手里-改写篇

news2025/1/31 8:16:21

背景

最近运营需要做月报汇总交易情况,之前一直是他们手工出的数据,他们想做成月初自动发送邮件,从而减轻他们的工作量。于是他们提供SQL我们在邮件服务器配置做定时发送任务。

表介绍(表及字段已做脱敏处理)

  • trans_profits
    交易毛利表:仅记录每天毛利数据
  • trans_offline_order
    线下订单表:记录线下订单情况
  • trans_online_order
    线上订单表:记录线上订单情况

SQL “变装”过程

原始:SQL
  • 缺点:不易读,查询套子查询
  • 查询解读:将线下及线上订单“交易笔数”“交易金额”数据合并再与毛利表按“交易日期”关联查询,显示:“交易笔数”,“交易金额”,“毛利金额”,“月份”
    –注:线上线下订单表为原始数据,毛利表为汇算后的数据,因此毛利表无需count(*)统计交易笔数;

 

select d.month       as 月,
       round(s.count/10000 , 2) ||'万'      as 交易笔数,
       round(s.amt/10000 , 2) ||'万'        as 交易金额,
       round(d.profits_amt/10000 , 2) ||'万' as 毛利金额
from (SELECT to_char(trans_time, 'yyyyMM') as month,
               sum(profits_amt) as profits_amt
          FROM trans_profits -- 交易毛利表
         where trans_time >=  to_date('20240101', 'yyyyMMdd')
         and   trans_time <   to_date('20241231', 'yyyyMMdd')
         group by to_char(trans_time, 'yyyyMM')) d
  left join (select month,
                    sum(count) as count,
                    sum(amt) as amt
               from (SELECT to_char(trans_time, 'yyyyMM') as month,
                            count(1) as count,
                            sum(trans_amt) as amt
                       FROM trans_offline_order  -- 线下订单表
                      where trans_cd = '00'
                        and trans_time >= to_TIMESTAMP('20240101', 'yyyyMMdd')
                        and trans_time <  to_TIMESTAMP('20241231', 'yyyyMMdd')
                      group by to_char(trans_time, 'yyyyMM')
                     union all
                     SELECT to_char(trans_time, 'yyyyMM') as month,
                            count(1) as count,
                            sum(trans_amt) AS amt
                       FROM trans_online_order  -- 线上订单表 
                      WHERE trans_type IN ('01', '02')
                        and trans_cd = '00'
                        and trans_time >= to_TIMESTAMP('20240101', 'yyyyMMdd')
                        and trans_time <  to_TIMESTAMP('20241231', 'yyyyMMdd')
                      group by to_char(trans_time, 'yyyyMM')) t
              group by month) s
    on d.month = s.month
 order by 1;

“变装”:SQL
  • 优点:查询简洁易懂
  • 查询解读:将线上、线下及毛利表进行数据合并,其中计算“交易笔数”线上、线下虚拟出列为ct 值为1标记,毛利表因为不需要记得笔数因此ct值标记为0,最后汇总时用sum(ct)列即可得到“交易笔数”。
SELECT 
substr(t.trans_time,0,6) 月,
       round(sum(ct) /10000 , 2) ||'万'         as 交易笔数,
       round(sum(trans_amt)/10000 , 2) ||'万'   as 交易金额,
       round(sum(profits_amt)/10000 , 2) ||'万' as 毛利金额
FROM (
SELECT to_char(trans_time,'yyyymmdd') trans_time,
        1 ct,
       trans_amt,
       0 profits_amt
FROM trans_offline_order  -- 线下订单表
where trans_cd = '00'
   and trans_time >= to_TIMESTAMP('20240101', 'yyyyMMdd')
   and trans_time <  to_TIMESTAMP('20241231', 'yyyyMMdd')
union all
SELECT to_char(trans_time,'yyyymmdd') trans_time,
         1 ct,
       trans_amt,
       0 profits_amt
FROM trans_online_order  -- 线上订单表 
WHERE trans_type IN ('01', '02')
   and trans_cd = '00'
   and trans_time >= to_TIMESTAMP('20240101', 'yyyyMMdd')
   and trans_time <  to_TIMESTAMP('20241231', 'yyyyMMdd')
union all 
SELECT to_char(trans_time,'yyyymmdd') trans_time,
       0 ct,
       0 trans_amt,
       profits_amt
FROM trans_profits  -- 交易毛利表
where trans_time  >= to_date('20240101', 'yyyyMMdd')
  and trans_time <   to_date('20241231', 'yyyyMMdd')
  ) t
  GROUP BY substr(t.trans_time,0,6)
  ORDER BY 1 ;

执行计划对比
  • Statistics 资源消耗 相同;
  • | Rows | Bytes | Cost (%CPU)| Time | 这几项明显“变装”后更优于原SQL写法,原SQL写法甚至还用到了TempSpc的耗;
  • 执行时间“变装”后慢了10+ms但影响不大;
    – 注(疑惑):明明从执行计划来分析“变装”后的SQL更优,为啥会变慢了呢?

    image.png

总结

SQL在其它部门的作用是以实现需求为主,但在DBA手里需要考虑在不改变需求结果的前提下,要让SQL更具有可读性及良好的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2284227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业财务管理系统的需求设计和实现

该作者的原创文章目录&#xff1a; 生产制造执行MES系统的需求设计和实现 企业后勤管理系统的需求设计和实现 行政办公管理系统的需求设计和实现 人力资源管理HR系统的需求设计和实现 企业财务管理系统的需求设计和实现 董事会办公管理系统的需求设计和实现 公司组织架构…

Couchbase UI: Server

在 Couchbase UI 中的 Server&#xff08;服务器&#xff09;标签页主要用于管理和监控集群中的各个节点。以下是 Server 标签页的主要内容和功能介绍&#xff1a; 1. 节点列表 显示集群中所有节点的列表&#xff0c;每个节点的详细信息包括&#xff1a; 节点地址&#xff1…

【软件设计师中级】-笔记缩减版本-计算机系统基础知识

1. 计算机系统基础知识 1.1. 计算机系统硬件基本组成硬件 中央处理器&#xff08;CPU&#xff09;硬件系统的核心 运算器 控制器 存储器&#xff08;记忆设备&#xff09; 内部存储器&#xff08;速度高&#xff0c;容量小&#xff09;&#xff1a;临时存放程序、数据及中间结…

SAP MM 记录一次SAP外协采购收货提示 这种物料的特殊库存 O 0100003359 14019002不存在的问题

根据采购订单收货&#xff0c;调用时 BAPI_GOODSMVT_CREATE时返回 { "TYPE":"E", "ID":"M7", "NUMBER":"076", "MESSAGE":"这种物料的特殊库存 O 0100003359 14019002不存在"…

在 Ubuntu22.04 上安装 Splunk

ELK感觉太麻烦了&#xff0c;换个日志收集工具 Splunk 是一种 IT 工具&#xff0c;可帮助在任何设备上收集日志、分析、可视化、审计和创建报告。简单来说&#xff0c;它将“机器生成的数据转换为人类可读的数据”。它支持从虚拟机、网络设备、防火墙、基于 Unix 和基于 Windo…

计算机网络 (60)蜂窝移动通信网

一、定义与原理 蜂窝移动通信网是指将一个服务区分为若干蜂窝状相邻小区并采用频率空间复用技术的移动通信网。其原理在于&#xff0c;将移动通信服务区划分成许多以正六边形为基本几何图形的覆盖区域&#xff0c;称为蜂窝小区。每个小区设置一个基站&#xff0c;负责本小区内移…

壁纸设计过程中如何增加氛围感

在壁纸设计过程中&#xff0c;增加氛围感是提升整体视觉效果和情感传达的关键。以下是一些具体的方法和技巧&#xff0c;帮助你在设计中营造出强烈的氛围感&#xff1a; 一、色彩运用 选择主题色&#xff1a; 根据你想要传达的情感选择主色调。例如&#xff0c;温暖的色调&…

|Python新手小白中级教程|第二十九章:面向对象编程(Python类的拓展延伸与10道实操题目)(5)

文章目录 前言1.类变量与实例变量2.静态方法和类方法1.静态方法2.类方法 3.实操使用1. 创建一个名为Person的类&#xff0c;包含属性name和age&#xff0c;并且有一个方法introduce()用于介绍自己的名字和年龄。2. 创建一个名为Circle的类&#xff0c;包含属性radius和color&am…

UE求职Demo开发日志#12 完善击杀获得物品逻辑和UI

1 实现思路 1.给WarehouseManager添加一个按TArray增加物品的函数 2.Enemy身上一个变量记录掉落物品&#xff0c;死亡时调用增加物品函数 3.同时调用UI显示 2 实现过程 2.1 在WarehouseManager里添加一个AddItemByArray函数 遍历数组调用添加函数 void UWarehouseManage…

安装Ubuntu22.04

1.引用教程 如何安装Ubuntu Server 22.04 LTS_ubuntu22.04 server-CSDN博客 2.空间分配 要使用 docker 比较多所以分别的 docker 空间大

【阅读笔记】基于整数+分数微分的清晰度评价算子

本文介绍的是一种新的清晰度评价算子&#xff0c;整数微分算子分数微分算子 一、概述 目前在数字图像清晰度评价函数中常用的评价函数包括三类&#xff1a;灰度梯度评价函数、频域函数和统计学函数&#xff0c;其中灰度梯度评价函数具有计算简单&#xff0c;评价效果好等优点…

scratch七彩六边形 2024年12月scratch三级真题 中国电子学会 图形化编程 scratch三级真题和答案解析

目录 scratch七彩六边形 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、…

Alfresco Content Services dockerCompose自动化部署详尽操作

Alfresco Content Services docker社区部署文档 Alfresco Content Services简介 Alfresco Content Services&#xff08;简称ACS&#xff09;是一款功能完备的企业内容管理&#xff08;ECM&#xff09;解决方案&#xff0c;主要面向那些对企业级内容管理有高要求的组织。具体…

电子应用设计方案105:智能家庭AI拖把系统设计

智能家庭 AI 拖把系统设计 一、引言 智能家庭 AI 拖把系统旨在为用户提供更高效、便捷和智能化的地面清洁解决方案&#xff0c;减轻家务劳动负担。 二、系统概述 1. 系统目标 - 自动清洁地面&#xff0c;包括吸尘、拖地和擦干功能。 - 智能识别地面材质和污渍程度&#xff0c…

Spring整合Mybatis、junit纯注解

如何创建一个Spring项目 错误问题 不知道什么原因&#xff0c;大概是依赖版本不兼容、java版本不对的问题&#xff0c;折磨了好久就是搞不成。 主要原因看pom.xml配置 pom.xml配置 java版本 由于是跟着22年黑马视频做的&#xff0c;java版本换成了jdk-11&#xff0c;用21以…

深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用

title: 深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用 date: 2025/1/26 updated: 2025/1/26 author: cmdragon excerpt: 在现代数据库管理系统中,索引技术是提高查询性能的重要手段。当数据量不断增长时,如何快速、有效地访问这些数据成为了数据库设计的核…

分布式系统学习:小结

关于分布式系统的学习就暂时告一段落了&#xff0c;下面整理了个思维导图&#xff0c;只涉及分布式的一些相关概念&#xff0c;需要的可自取。后面准备写下关于AI编程相关的技术文章&#xff0c;毕竟要紧跟时代的脚步嘛 思维导图xmind文件下载地址&#xff1a;https://download…

基于STM32的阿里云智能农业大棚

目录 前言&#xff1a; 项目效果演示&#xff1a; 一、简介 二、硬件需求准备 三、硬件框图 四、CubeMX配置 4.1、按键、蜂鸣器GPIO口配置 4.2、ADC输入配置 4.3、IIC——驱动OLED 4.4、DHT11温湿度读取 4.5、PWM配置——光照灯、水泵、风扇 4.6、串口——esp8266模…

WGCLOUD使用介绍 - 如何监控ActiveMQ和RabbitMQ

根据WGCLOUD官网的信息&#xff0c;目前没有针对ActiveMQ和RabbitMQ这两个组件专门做适配 不过可以使用WGCLOUD已经具备的通用监测模块&#xff1a;进程监测、端口监测或者日志监测、接口监测 来对这两个组件进行监控

Win11画图工具没了怎么重新安装

有些朋友想要简单地把图片另存为其他格式&#xff0c;或是进行一些编辑&#xff0c;但是发现自己的Win11系统里面没有画图工具&#xff0c;这可能是因为用户安装的是精简版的Win11系统&#xff0c;解决方法自然是重新安装一下画图工具&#xff0c;具体应该怎么做呢&#xff1f;…