SQL语法 一个统计的查询

将外部电磁近场数据导入 ANSYS HFSS 本博客介绍了如何将电磁近场数据导入 ANSYS HFSS。用户可能需要导入字段,无论是通过分析计算、测量、由其他工具生成还是从提供商处接收的字段,并将其用作实际激励来执行不同类型的分析。以下是导入过程的简要概述,视频链接中提供了完整的演示。为了定义简单基元近场源,HFSS 使用两种外部数据文件。首先,实际位置/字段数据以 .nfd 格式存储。其次,Ansys Near field Descriptor 文件(.and 文件)存储 .nfd 数据的一般几何信息和路径。 阅读详情
 <select id="getPersonInfo" resultType="com.purvar.report.facade.vo.jxappuser.PersonDetailVO">
        SELECT
            #{request.memberId} AS id,
            NULL AS departRank,
            NULL AS levelRank,
            NVL(f.visitCount, 0) AS visitCount,
            CASE
                WHEN NVL(p.totalProjectCount, 0) = 0 THEN 0
                ELSE ROUND(NVL(p.futureIndustryCount, 0) * 100.0 / p.totalProjectCount, 2)
            END AS futureIndustryRate,
            NVL(d.projectCount, 0) AS projectCount,
            NULL AS irr,
            NULL AS tvpi,
            NULL AS leadRatio,
            NULL AS manageNum
        FROM DUAL
        LEFT JOIN (
            SELECT COUNT(1) AS visitCount
            FROM ADS.jx_proj_follow_info f
            WHERE (f.is_delete = 0 OR f.is_delete IS NULL)
            <choose>
                <when test="request.memberName != null and request.memberName != ''">
                    AND f.follower IS NOT NULL
                    AND INSTR(
                        ',' || REPLACE(REPLACE(f.follower, ',', ','), ' ', '') || ',',
                        ',' || REPLACE(REPLACE(#{request.memberName}, ',', ','), ' ', '') || ','
                    ) > 0
                </when>
                <otherwise>
                    AND 1 = 0
                </otherwise>
            </choose>
        ) f ON 1 = 1
        LEFT JOIN (
            SELECT
                COUNT(DISTINCT p.proj_id) AS totalProjectCount,
                COUNT(DISTINCT CASE WHEN p.is_future_industry = '1' THEN p.proj_id END) AS futureIndustryCount
            FROM ADS.jx_proj_info p
            WHERE (p.is_delete = 0 OR p.is_delete IS NULL)
            <choose>
                <when test="request.memberId != null">
                    AND p.member_id = #{request.memberId}
                </when>
                <otherwise>
                    AND 1 = 0
                </otherwise>
            </choose>
        ) p ON 1 = 1
        LEFT JOIN (
            SELECT COUNT(DISTINCT d.proj_id) AS projectCount
            FROM ADS.jx_decision_info d
            WHERE (d.is_delete = 0 OR d.is_delete IS NULL)
            <choose>
                <when test="request.memberId != null">
                    AND d.member_id = TO_CHAR(#{request.memberId})
                </when>
                <otherwise>
                    AND 1 = 0
                </otherwise>
            </choose>
        ) d ON 1 = 1
    </select>

SQL 语句详细解析

这段 SQL 是一个 MyBatis 映射文件中的查询语句,用于获取个人(成员)的详细信息。下面我将从多个维度进行详细解析:

1. 整体功能

此 SQL 的主要功能是查询指定成员(员工)的项目相关统计信息,包括:

  • 访问次数(visitCount)
  • 未来产业项目占比(futureIndustryRate)
  • 负责项目数量(projectCount)
  • 其他预留的统计字段(如 IRR、TVPI 等,当前为 NULL)

2. 核心结构解析

2.1 主查询部分
SELECT
    #{request.memberId} AS id,  -- 直接使用传入的成员ID作为结果ID
    NULL AS departRank,         -- 部门排名(暂未实现)
    NULL AS levelRank,          -- 级别排名(暂未实现)
    NVL(f.visitCount, 0) AS visitCount,  -- 访问次数,空值转为0
    CASE
        WHEN NVL(p.totalProjectCount, 0) = 0 THEN 0
        ELSE ROUND(NVL(p.futureIndustryCount, 0) * 100.0 / p.totalProjectCount, 2)
    END AS futureIndustryRate,  -- 未来产业项目占比(百分比)
    NVL(d.projectCount, 0) AS projectCount,  -- 决策项目数量
    NULL AS irr,                -- 内部收益率(暂未实现)
    NULL AS tvpi,               -- 投资回报倍数(暂未实现)
    NULL AS leadRatio,          -- 领导力比例(暂未实现)
    NULL AS manageNum           -- 管理数量(暂未实现)
FROM DUAL
  • DUAL:Oracle 中的虚拟表,用于构建单行查询
  • NVL():Oracle 的空值处理函数,将 NULL 转为指定值(这里是0)
  • CASE WHEN:计算未来产业项目占比,避免除零错误
2.2 三个 LEFT JOIN 子查询
2.2.1 访问次数统计(f 子查询)
LEFT JOIN (
    SELECT COUNT(1) AS visitCount
    FROM ADS.jx_proj_follow_info f
    WHERE (f.is_delete = 0 OR f.is_delete IS NULL)
    <choose>
        <when test="request.memberName != null and request.memberName != ''">
            AND f.follower IS NOT NULL
            AND INSTR(
                ',' || REPLACE(REPLACE(f.follower, ',', ','), ' ', '') || ',',
                ',' || REPLACE(REPLACE(#{request.memberName}, ',', ','), ' ', '') || ','
            ) > 0
        </when>
        <otherwise>
            AND 1 = 0  -- 条件不满足时不统计
        </otherwise>
    </choose>
) f ON 1 = 1

功能:统计该成员的项目跟进记录数
关键逻辑:

  • 从 jx_proj_follow_info 表统计未删除的记录
  • 当传入成员姓名时,使用 INSTR 函数在 follower 字段中查找该姓名
  • REPLACE 函数处理中文逗号和空格,确保格式统一
  • 1 = 0 表示条件不满足时返回空结果
2.2.2 项目统计(p 子查询)
LEFT JOIN (
    SELECT
        COUNT(DISTINCT p.proj_id) AS totalProjectCount,
        COUNT(DISTINCT CASE WHEN p.is_future_industry = '1' THEN p.proj_id END) AS futureIndustryCount
    FROM ADS.jx_proj_info p
    WHERE (p.is_delete = 0 OR p.is_delete IS NULL)
    <choose>
        <when test="request.memberId != null">
            AND p.member_id = #{request.memberId}
        </when>
        <otherwise>
            AND 1 = 0
        </otherwise>
    </choose>
) p ON 1 = 1

功能:统计成员负责的项目总数和未来产业项目数
关键逻辑:

  • totalProjectCount:成员负责的独立项目总数
  • futureIndustryCount:标记为未来产业(is_future_industry = '1')的项目数
  • 条件判断:当传入成员ID时才进行统计
2.2.3 决策项目统计(d 子查询)
LEFT JOIN (
    SELECT COUNT(DISTINCT d.proj_id) AS projectCount
    FROM ADS.jx_decision_info d
    WHERE (d.is_delete = 0 OR d.is_delete IS NULL)
    <choose>
        <when test="request.memberId != null">
            AND d.member_id = TO_CHAR(#{request.memberId})
        </when>
        <otherwise>
            AND 1 = 0
        </otherwise>
    </choose>
) d ON 1 = 1

功能:统计成员参与的决策项目数量
关键逻辑:

  • 从 jx_decision_info 表统计未删除的决策记录
  • TO_CHAR():将数值型成员ID转为字符串进行匹配
  • 同样使用条件判断确保参数有效性

3. MyBatis 动态 SQL 标签解析

<choose>、<when>、<otherwise>
  • 作用:实现条件分支逻辑
  • 示例:当 request.memberName 不为空时,执行姓名匹配逻辑;否则返回空结果
  • 优势:避免在参数为空时产生无效查询
#{request.memberId} 和 #{request.memberName}
  • 作用:MyBatis 的参数占位符,防止 SQL 注入
  • 区别:
    • memberId:用于精确匹配(项目表和决策表)
    • memberName:用于模糊匹配(跟进表的 follower 字段)

4. 业务场景分析

4.1 适用场景

此 SQL 可能用于以下业务场景:

  1. 个人工作台/仪表盘:展示个人的关键绩效指标
  2. 领导查看下属数据:了解团队成员的项目参与情况
  3. 绩效考核:作为项目参与度和贡献度的参考数据
  4. 人才盘点:评估员工在重点项目(未来产业)中的参与比例
4.2 数据流向
成员ID/姓名 → 参数传入 → 三个子查询并行统计 → 主查询汇总 → VO对象返回
4.3 设计特点
  1. 模块化设计:三个子查询职责清晰,便于维护
  2. 空值安全:全程使用 NVL 处理 NULL 值
  3. 条件防御:参数为空时返回空结果,避免全表扫描
  4. 扩展性:预留了多个统计字段(如 IRR、TVPI 等)为后续功能留出接口

5. 潜在优化建议

5.1 性能方面
  • 三个子查询可考虑合并或使用 WITH 子句(CTE)
  • INSTR 函数对 follower 字段的模糊匹配可能影响性能,建议建立专门的关联表
  • 频繁查询时可考虑添加适当的索引
5.2 可读性方面
  • 可添加注释说明各字段的业务含义
  • 复杂的字符串处理逻辑可提取为数据库函数
  • 魔法数字(如 '1' 表示未来产业)可定义为常量
5.3 功能扩展
  • 当前许多字段返回 NULL,后续可根据业务需求逐步实现
  • 可添加时间范围过滤(如统计最近一年的数据)
  • 可考虑添加项目状态过滤(只统计进行中的项目)

6. 总结

这个 SQL 语句是一个典型的个人数据统计查询,具有以下特点:

  1. 安全性:使用参数化查询防止 SQL 注入
  2. 健壮性:全面处理 NULL 值和边界条件
  3. 模块化:不同统计维度分离,便于理解和维护
  4. 可扩展:预留字段支持未来功能扩展
  5. 业务导向:紧密围绕项目管理的核心指标设计

在实际使用中,建议:

  • 确保传入参数的合法性验证
  • 监控大数据量下的查询性能
  • 根据业务发展适时调整统计逻辑
ESP32连接PDM麦克风操作指南:新手入门必看 手把手教你如何将ESP32与PDM麦克风连接,采集音频数据并用于音频分类应用。内容涵盖硬件接线、代码配置及实际调试技巧,适合初学者快速上手esp32在声音识别场景中的使用。 阅读详情

相关推荐

解码运动想象:BCI Competition IV 2a数据集实战指南

本文提供了BCI Competition IV 2a数据集的实战指南,详细解析了该经典运动想象脑电数据集的结构、文件格式与实验范式。通过MNE-Python等工具,逐步演示了从原始信号读取、预处理(通道选择、滤波、分段)到特征提取(CSP、频带功率)和模型训练(LDA、SVM)的完整流程,并强调了受试者独立评估的重要性,为BCI研究者提供了可复现的入门与进阶路径。

weixin_29304985的博客 362

Mysql按某个字段实现分组统计Top5 Sql语法查询语句

Mysql按某个字段实现分组统计Top5 Sql语法查询语句SET @id:= 0,@type1:= '';SELECT dsx.row_number, dsx.type, dsx.type_name, dsx.SKU, dsx.numberFROM(SELECT b.type, b.type_name, b.SKU, b.number,       @id:= IF(@type1 = type,...

云加速 3796

NS-3 和Aqua-sim-ng 学习笔记(一)

因为要搞水下网络,OMNET++不太合适,就转Aqua-sim。这是基于NS-2上的模型,NS-2需要额外学一门tcl脚本语言。 正好查到它的一个升级版Aqua-sim-NG,在github上,https://github.com/rmartin5/aqua-sim-ng是基于NS-3的,只需要基本的C++,不用学tcl语言。美滋滋。 装好ubuntu之后,安装NS-3和Aqu...

diboshang8820的博客 2191

ArcadeDB SQL 深入指南:并行查询、聚合统计与高级语法技巧

ArcadeDB 是一个同时支持 SQL、Cypher、Gremlin、HTTP/JSON、MongoDB 和 Redis 协议的多模型数据库(Multi-Model Database),并内置向量检索能力。本文是面向开发者的 ArcadeDB SQL 深入指南,重点讲解并行查询加速、聚合统计函数以及 MATCH、TRAVERSE、UNWIND 等高级语法技巧,帮助你从"能用 SQL"进阶到"用好

gitblog_00062的博客 209

Halcon深度学习实战:基于异常值检测的工业缺陷精准识别方案

本文详细介绍了Halcon深度学习中的异常值检测技术在工业缺陷识别中的应用。该方法仅需少量正常样本即可训练,能有效应对未知、多变的缺陷类型,显著降低项目启动门槛。文章提供了从数据准备、模型训练、参数调优到产线部署的完整实战指南,并分享了关键的性能优化与避坑经验。

weixin_29042035的博客 243

手把手教你用FPGA实现SerDes高速接口设计(附避坑指南)

本文是一份详尽的FPGA SerDes高速接口设计实战指南。文章深入剖析了SerDes硬核(如GTX/GTH)的时钟管理、发送端均衡、接收端CDR与均衡等核心模块,并提供了Verilog代码示例。重点分享了信号完整性分析、眼图调试与误码率测试等实战经验,附有自定义高速视频流接口的完整实现案例与避坑指南,帮助工程师从“会用”到“懂”且能独立驾驭高速接口设计。

ik678901234的博客 1146

Oracle 11g 学习四:多表查询、左右连接、SQL1999语法、统计函数及分组查询

一、多表查询

jixiangrurui的专栏 1445

PX4从放弃到精通(二十八):垂起过渡控制

固件版本:1.14.0可加名片交流学习。

超维空间科技的博客 2873

SQL Server复杂查询实战:从基础语法到分组统计

实践时,发现其SQL编辑器能实时验证语法错误,部署后的项目可直接分享查询结果。特别是分组统计这类需要可视化验证的场景,平台的内置数据库和结果渲染让学习效率大幅提升,无需本地配置SQL Server环境即可完成全部实验。注意主外键关系,避免笛卡尔积(如查询含"数据"的课程时需指定表关联条件)动态转换字段值(如将CS显示为计算机系)实现条件计数(如分性别统计院系人数)在分组后过滤,如统计不及格科目时应在。先按院系分组计算人数,再用。分级标注规模,注意处理。

ThunderstormDragon65的博客 325

解决RabbitMq登录时报出Not management user(Login failed)错误以及rabbitmqctl(RabbitMq)新增用户和用户角色权限

解决RabbitMq登录时报出Not management user(Login failed)错误以及rabbitmqctl(RabbitMq)查看用户权限、新增用户和用户角色权限。

念兮为美 7479

Python爬虫实战:模拟登录知乎 – 通过加密参数和验证码实现自动登录

通过本篇博客的讲解,我们学习了如何通过 POST请求 和 验证码识别,模拟登录知乎并爬取用户信息、问题数据。随着爬虫技术的发展,面对更复杂的反爬虫机制,我们可以不断调整策略,以绕过这些防护,实现数据的自动化抓取。

2201_76125261的博客 731

oracle统计查语法,oracle统计查询 sql语句应当怎么写

select substrb(create_time,1,4) "年份",sum(decode(substrb(create_time,6,2),'01',commission,0)) "1月",sum(decode(substrb(create_time,6,2),'02',commission,0)) "2月",sum(decode(substrb(create_time,6,2),'03',...

weixin_39999222的博客 158

Python 神经计算实训 实训答案分享

【代码】Python 神经计算实训 实训答案分享。

2403_89314916的博客 350

Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等)

Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等) 子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 = from c in ctx.Customers where (from o in ctx.Orders group o by o...

weixin_30641999的博客 210

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

oracle数据库多表查询、sql1999语法、子查询、内连接、外连接(左外连接,右外连接)、统计查询、多字段分组、创建和管理表

Oracle重点知识点1、排序排序可以是实现多条件排序(同一条件相同的情况下按照后续条件进行排序即可一次类推完成)案例2.多表查询分析产生“积”的问题解决消除“积”-,添加条件查询结果此时正常显示,但是“积”还存在。“积”的影响数据库数据量小的情况下无明显影响。数据库数据量大的情况下处理性(查询)能差。说明处理性能差会会影响用户下降3.内连接多张表指定的列必须相等[from左表,右表]左表.字段=右表.字段说明外连接可以控制具体表的显示。结果。...

睡不醒的每天 664

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

TP SQL统计查询语法,示例:获取今日订单总数和订单总金额

获取今日订单总数和订单总金额 //fields区分出order_type不等于1的订单,订单金额money加运费order_freight合计 $fields = [ 'COUNT(1) as order_num', 'SUM(IF(order_type != 1, money + order_freight, 0)) as order_price' ]; //where区分统计今日订单,已付款pay_status状态 $where = [ [ '

BUG制造者:图图 <p>这是一个P标签</p> 6886

SQL转 MongoDB语法速查表

SQL转 MongoDB语法速查表 翻译整理:qqxufo  我的博客:http://hhxblog.leanote.com/ 吐槽:学习MongoDB的时候,在官网看到了SQL 到 MongoDB 的语法转换图。觉得内容不错,所以打算将其整理出来以便日后的学习和使用。 PS:右上角自带目录,可以进行速查。 术语和概念 SQL MongoDB database dat...

ronon77的专栏 5957

sql语言查询与集合操作

完整sql语句较复杂,但是其基本语法格式可以归纳如下: select select_list from table_list [where search_conditions] [group by group_by_expression] [having search_conditions] [order by order_expression[asc| desc]]简单查询 例

_小明同学__ 1万+

mssql 将查询结果作为表名参数_Excel也能用SQL,复杂查询几行就搞定

点击上方蓝色文字关注我们大家好!《全民一起用SQL》课程上线以来,很多同学都提出过这样的问题:“能不能在Excel里用SQL命令?”、“SQL查询很强大,但难道要把Excel数据导到数据库里去查询吗?”,以及“单位电脑上没有数据库,我怎么练习SQL呢” ……其实上述问题都可以轻松解决 ——因为Excel本身就能用SQL!不仅能用,而且微软这一次支持的还是标准SQL语法(每次想到这里就要...

weixin_39551103的博客 635

课堂解说-SQL语法

SQL 语法 1、课程名称:SQL语法 2、知识点 2.1、上次课程的主要知识点 1、DML语法全部讲解完成; 2、多表查询:首先要确定数据显示列所在的表,而后如果有多张表连接查询,肯定会存在各种关联字段,以消除笛卡尔积,如果发现所需要的数据没有显示出来,则可以通过左右连...

huang714的专栏 954

复制几行_Excel也能用SQL,复杂查询几行就搞定

点击上方蓝色文字关注我们大家好!《全民一起用SQL》课程上线以来,很多同学都提出过这样的问题:“能不能在Excel里用SQL命令?”、“SQL查询很强大,但难道要把Excel数据导到数据库里去查询吗?”,以及“单位电脑上没有数据库,我怎么练习SQL呢” ……其实上述问题都可以轻松解决 ——因为Excel本身就能用SQL!不仅能用,而且微软这一次支持的还是标准SQL语法(每次想到这里就要...

weixin_29513805的博客 472

rainfrog 0.2.0新特性:语法高亮与查询时长统计

你是否还在为终端数据库工具缺乏现代编辑体验而困扰?是否在执行复杂查询时无法直观了解性能瓶颈?rainfrog 0.2.0版本正式发布,带来两大核心升级:高性能语法高亮编辑器和实时查询时长统计,让终端数据库操作既高效又直观。本文将详细介绍这两项功能的使用方法和技术实现,帮助你快速掌握新版本带来的生产力提升。 ## 功能概览:0.2.0版本核心升级 rainfrog作为一款轻量级终端数据库管理工具...

gitblog_00281的博客 404

sql统计查询结果行数_SQL-汇总分析篇

一、汇总分析(一)语法Sql中的汇总函数有以下几个:Count :求某列的行数Sum :对某列数据求和(只对数值类型的列进行计算)Avg :求某列数据的平均值(只对数值类型的列进行计算)Max : 求某列数据的最大值Min :求某列数据的最小值Select count/ sum/ avg/max/min 列名From 表名;(二)实例1、countPS:(1)count(*)表示表格行数;(2)c...

weixin_39677870的博客 2万+

mysql查询男生基本情况_MySQL查询

简介查询的基本语法select * from 表名;from关键字后面写表名,表示数据来源于是这张表select后面写表中的列名,如果是*表示在结果中显示表中所有列在select后面的列名部分,可以使用as为列起别名,这个别名出现在结果集中如果要查询多个列,之间使用逗号分隔消除重复行在select后面列前使用distinct可以消除重复的行select distinct gender from s...

weixin_34621896的博客 820

DB SQL 转 ES DSL(支持多种数据库常用查询、统计、平均值、最大值、最小值、求和语法)...

1. 简介   日常开发中需要查询Elasticsearch中的数据时,一般会采用RestHighLevelClient高级客户端封装的API。项目中一般采用一种或多种关系型数据库(如:Mysql、PostgreSQL、Oracle等) + NoSQL(如:Elasticsearch)存储方案;不同关系数据库可以采用Mybatis-Plus方案屏蔽数据库的方言差异,我们期望可以像操作关系型数据库...

C3Stones 3789

sql语句count(*)空格导致的错误

java.sql.SQLSyntaxErrorException You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near *) from student’ at line 1 写了一个统计学生表人数的查询接口,浏览器运行出错 idea报错 java.sql.SQLSyntaxErrorExcep

emmm520的博客 1941

SQL中的数据查询语句汇总

为什么80%的码农都做不了架构师?>>> ...

weixin_34050427的博客 291
上一篇: List model转vo
下一篇: SQL语法 某个字段逗号分隔匹配
han_hanker
博客等级 码龄13年 35粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值