一个sql和C#代码结合的分组求和的查询
业务描述: 业务主表(tab_main 主键 id), 供应商名称(supplier), 金额(amount 需要统计求和),还有分类( 有单独的表categoryid),集中采购标记字段(tenderMark),审核时间(auditTime)
分类表: (tab_category ),分类id: categoryid,分类名称: categoryname
主表是明细数据, 要对这个明细 进行统计, 固定列: 供应商名称,总金额,集采金额, 后面是各个分类的列,有多少个分类,就有多少列(动态的)
现在写这个sql 思路:
(1) 基础查询 sourceData
with sourceData as (
select a.supplier, a.amount, (case when a.tenderMark=1 then a.amount else 0 end) as tenderAmount,a.categoryid
where a.auditTime between to_date('2022-01-01 00:00:00',yyyy-mm-dd hi24:mi:ss) and to_date('2022-03-01 00:00:00',yyyy-mm-dd hi24:mi:ss)
)
(2)根据分类 构造 数据集 dataALL
with dataALL as (
select 1 as Category0, 0 as Category1, 0 as Category2, 0 as Category3, T.* from sourceData T where categoryid=1
union all select 0 as Category0, 1 as Category1, 0 as Category2, 0 as Category3, T.* from sourceData T where categoryid=2
union all select 0 as Category0, 0 as Category1, 1 as Category2, 0 as Category3, T.* from sourceData T where categoryid=3
union all select 0 as Category0, 0 as Category1, 0 as Category2, 1 as Category3, T.* from sourceData T where categoryid=3
... --动态的, 有多少个分类 就 重复拼接,通过C#代码实现, 构建对应的列数据
)
(4)根据分类,group by
select supplier,sum(amount) as amountSum , sum(tenderAmount) as tenderAmountSum
,(case when Category0=1 then sum(amount) else 0 end) as Category0AmountSum
,(case when Category1=1 then sum(amount) else 0 end) as Category1AmountSum
,(case when Category2=1 then sum(amount) else 0 end) as Category2AmountSum
,(case when Category3=1 then sum(amount) else 0 end) as Category3AmountSum
... --动态拼接
from dataALL group by supplier,Category0,Category1,Category2,Category3
(5) 之前以为上面就写完了,后来发现 部署到正式上, 一个供应商对应多条数据出来,
原来当 一个 供应商 有多个分类的时候,数据就会....
那就继续group by 合并一下
select supplier, sum(amountSum ) amountSum , sum(tenderAmountSum) tenderAmountSum
,sum(Category0AmountSum) Category0AmountSum
,sum(Category1AmountSum) Category1AmountSum
,sum(Category2AmountSum) Category2AmountSum
,sum(Category3AmountSum) Category3AmountSum
... --动态拼接
from (上面的(4)的查询 ) newTab
group by supplier
order by supplier asc
测试一下数据, 没问题了,就可以部署了.
上面标记颜色的部分, 是可以用 C#代码 进行 循环填充的, 多定义几个 StringBuilder 循环 拼接字符串.
小结一下: 将复杂的问题 简单化, 分类为 3个的时候怎么写, 4个的时候 怎么写,然后推断成 动态的怎么拼接 sql.
PS: (1) 我知道有其他的实现方式, 或者什么 行转列的 写法 ,但是好在 我知道我这个业务的分类 不会很多(一般4到6个,不会超过7个)
就这样简单写一下,效率也还行,凑合用,实现效果就行.
(2) 先把数据取出来,然后用C# 代码 分组合并, 也是一个思路 ,但是这个 有悖于 开发规范.
一般 数据能在数据库 里面操作的, 直接数据库 里面操作,数据库不方便操作的, 拿出来用 C# 代码补充操作.
我给这个写法批2个字: 拙技
一个sql和C#代码结合的分组求和的查询的更多相关文章
- 求bat文件创建mysql数据库,并调用一个SQL文件的代码
@echo off set path=C:\program files\mysql\mysql server 5.5\bin cd ./ set CURR_PATH=%cd% mysql -h loc ...
- 2019-1-11 SQL语句汇总——聚合函数、分组、子查询及组合查询
- 如何实现一个SQL解析器
作者:vivo 互联网搜索团队- Deng Jie 一.背景 随着技术的不断的发展,在大数据领域出现了越来越多的技术框架.而为了降低大数据的学习成本和难度,越来越多的大数据技术和应用开始支持SQL进 ...
- 用scala实现一个sql执行引擎-(上)
前言 在实时计算中,通常是从队列中收集原始数据,这种原始数据在内存中通常是一个java bean,把数据收集过来以后,通常会把数据落地到数据库,供后面的ETL使用.举个一个简单的例子,对一个游戏来说, ...
- 自己实现一个SQL解析引擎
自己实现一个SQL解析引擎 功能:将用户输入的SQL语句序列转换为一个可运行的操作序列,并返回查询的结果集. SQL的解析引擎包含查询编译与查询优化和查询的执行,主要包含3个步骤: 查询分析: 制定逻 ...
- 查询统计SQL分组求和使用小技巧
我们在做查询统计时,肯定会遇到将查询结果再次分组求和这种需求,但是往往查询的sql本身就比较复杂,再使用分组函数不太可能,那么这时候我们就想到了用临时表的办法,通过联合临时表我们就可以获得想要的分组求 ...
- SQL语句汇总(三)——聚合函数、分组、子查询及组合查询
聚合函数: SQL中提供的聚合函数可以用来统计.求和.求最值等等. 分类: –COUNT:统计行数量 –SUM:获取单个列的合计值 –AVG:计算某个列的平均值 –MAX:计算列的最大值 –MIN:计 ...
- 使用BAT批处理执行sql语句的代码
使用BAT批处理执行sql语句的代码 有时候需要执行一些Sql语句时,不想开企业管理器,或者是发给客户执行但那边又不懂代码,这时就可以用下面方法 1.把待执行Sql保存在一个文件,这里为2011022 ...
- 一个SQL Server 2008 R2 死锁的问题解决
问题场景:在客户那碰到一个操作卡死的现象 问题解决: 1.如何挂钩是死锁问题:通过代码跟踪,发现是指执行一个SQL语句超时,因此猜想可能是表锁住了 2.如果确认是思索问题:通过SQL发现死锁,以下是相 ...
随机推荐
- 【软件学习】如何将Typora中的本地图片上传到博客
1. 配置方法 下载软件: 点击程序输入博客信息进行配置: 进行偏好设置: 2. 配置中出现的一些问题 解决方法:
- java中的栈(利用数组实现栈)
java中的栈(利用数组实现栈) 常见的数据结构:https://blog.csdn.net/weixin_43304253/article/details/119764275 栈的介绍 1.栈的英文 ...
- MyBatisPlus分页插件在SpringBoot中的使用
文章目录 1.目录结构 2.新增配置 3.编写测试类 4.测试结果 5.数据库中的表 文件的创建: https://blog.csdn.net/weixin_43304253/article/deta ...
- 怎样在GitHub上建立仓库、以及怎样实现分支代码的合并。保姆级别的教程
GitHub官网地址:https://github.com/ 注意:前提是已经注册了GitHub 文章目录 第一步:创建一个新的仓库 第二步.创建一个分支 第三步.编辑和发布更改的内容 第四步.拉取请 ...
- 16.-admin管理后台
一.admin管理后台 Django提供给了比较完善的后台管理数据库接口,可供开发过程中调用和测试使用 Django会搜集所有已注册的模型类,为这些模型类提供数据管理界面,供开发者使用 命令:py ...
- flutter 系列之:flutter 中的幽灵offstage
目录 简介 Offstage详解 Offstage的使用 总结 简介 我们在使用flutter的过程中,有时候需要控制某些组件是否展示,一种方法是将这个组件从render tree中删除,这样这个组件 ...
- 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南)-L Bit Sequence
题意 给你两个数l,m,大小为m的数组a,求[0,l]之间满足以下条件的数x的个数: 对于任何i输入[0,m-1],f(x+i)%2=a[i]:f(k):代表k在二进制下1的个数 m的范围<=1 ...
- 重新整理 .net core 实践篇 ———— linux上性能排查 [外篇]
前言 该文的前置篇为: https://www.cnblogs.com/aoximin/p/16839830.html 本文介绍性能排查. 正文 上一节是出现错误了,如何去排查具体问题. 这一节介绍一 ...
- C语言嵌套for循环实现冒泡排序
使用嵌套for循环实现冒泡排序的一个函数. #include<stdio.h> /** * 介绍: * 使用嵌套for循环实现冒泡排序,由小到大(上小下大). * 参数: * sum[]: ...
- java学习之EL和JSTL
0x00前言 EL和JSTL都是JSP的内容的拓展,都是开发的一些东西,稍微学习记录一下,避免以后忘记 0x01EL 0x1基本用法 概念:Expression language 表达式语言 作用:替 ...