业务描述:  业务主表(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#代码结合的分组求和的查询的更多相关文章

  1. 求bat文件创建mysql数据库,并调用一个SQL文件的代码

    @echo off set path=C:\program files\mysql\mysql server 5.5\bin cd ./ set CURR_PATH=%cd% mysql -h loc ...

  2. 2019-1-11 SQL语句汇总——聚合函数、分组、子查询及组合查询

  3. 如何实现一个SQL解析器

    ​作者:vivo 互联网搜索团队- Deng Jie 一.背景 随着技术的不断的发展,在大数据领域出现了越来越多的技术框架.而为了降低大数据的学习成本和难度,越来越多的大数据技术和应用开始支持SQL进 ...

  4. 用scala实现一个sql执行引擎-(上)

    前言 在实时计算中,通常是从队列中收集原始数据,这种原始数据在内存中通常是一个java bean,把数据收集过来以后,通常会把数据落地到数据库,供后面的ETL使用.举个一个简单的例子,对一个游戏来说, ...

  5. 自己实现一个SQL解析引擎

    自己实现一个SQL解析引擎 功能:将用户输入的SQL语句序列转换为一个可运行的操作序列,并返回查询的结果集. SQL的解析引擎包含查询编译与查询优化和查询的执行,主要包含3个步骤: 查询分析: 制定逻 ...

  6. 查询统计SQL分组求和使用小技巧

    我们在做查询统计时,肯定会遇到将查询结果再次分组求和这种需求,但是往往查询的sql本身就比较复杂,再使用分组函数不太可能,那么这时候我们就想到了用临时表的办法,通过联合临时表我们就可以获得想要的分组求 ...

  7. SQL语句汇总(三)——聚合函数、分组、子查询及组合查询

    聚合函数: SQL中提供的聚合函数可以用来统计.求和.求最值等等. 分类: –COUNT:统计行数量 –SUM:获取单个列的合计值 –AVG:计算某个列的平均值 –MAX:计算列的最大值 –MIN:计 ...

  8. 使用BAT批处理执行sql语句的代码

    使用BAT批处理执行sql语句的代码 有时候需要执行一些Sql语句时,不想开企业管理器,或者是发给客户执行但那边又不懂代码,这时就可以用下面方法 1.把待执行Sql保存在一个文件,这里为2011022 ...

  9. 一个SQL Server 2008 R2 死锁的问题解决

    问题场景:在客户那碰到一个操作卡死的现象 问题解决: 1.如何挂钩是死锁问题:通过代码跟踪,发现是指执行一个SQL语句超时,因此猜想可能是表锁住了 2.如果确认是思索问题:通过SQL发现死锁,以下是相 ...

随机推荐

  1. Skywalking Swck Agent注入实现分析

    项目地址: GitHub - apache/skywalking-swck: Apache SkyWalking Cloud on Kubernetes 项目简介: A bridge project ...

  2. 利用Java集合实现学生信息的”增删查“

    之前学了Java中的集合,打算写一个小程序来消化一下! 那么我们知道,集合相比数组的优点就是可以动态的增加元素,这对比数组来说,十分的便捷: 并且集合为我们封装好一些方法,可以更好的做一些数据操作! ...

  3. CSAPP实验attacklab

    attacklab 实验报告和答案文件都在 https://github.com/thkkk/attacklab

  4. 2022年最新最详细在IDEA中配置Tomcat(含有详细图解过程)、建立使用IEDA建立一个Web项目的案例

    1.首先已经成功安装过tomcat 如果没有成功安装,参考这篇tomcat安装教程(安装成功可忽略):https://blog.csdn.net/weixin_43304253/article/det ...

  5. 5.pygame快速入门-精灵和精灵组

    在之前案例中,图像加载.位置变化.绘制图像都需要编写代码分别处理 pygame提供了两个类简化开发步骤 pygame.sprite.Sprite #精灵,存储图像数据image和位置rect的对象 p ...

  6. Kubeadm部署Kubernetes

    Kubeadm部署Kubernetes 1.环境准备 主机名 IP 说明 宿主机系统 k8s-master 10.0.0.101 Kubernetes集群的master节点 Ubuntu2004 k8 ...

  7. 不用终端运行 Vue项目 基于Pycharm

    不用终端运行 Vue项目 基于Pycharm 如下图展示 接下来 然后单击右上角运行 即可完成运行

  8. C#串口初始化

    //通信端口 string[] PortList = SerialPort.GetPortNames(); if (PortList.Length > 0) { this.cmb_Port.Da ...

  9. C++初阶(类的访问权限以及封装+this指针+构造函数+析构函数+拷贝构造函数+参数列表+友元+内部类)

    面向过程与面向对象 C语言是面向过程的,关注的是过程(函数),分析出求解问题的步骤,通过函数调用逐步解决问题. C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成. ...

  10. golang 简书

    https://www.jianshu.com/p/548adff0d10d Go 入门指南 https://github.com/wuxiaoxiaoshen/go-example-for-live ...