mysql 分类汇总_sql多级分类汇总实现介绍

t1

id parentid

m a

n a

e m

f m

x f

y f

z b

t2

row id amount

1 a 13.00

2 b 20.00

3 e 20.00

4 f 20.00

5 x 20.00

6 y 20.00

7 z 20.00

8 e 12.00

9 x 11.00

10 f 13.00

如何得出如下结果:

row id amount

7 x 20.00

11 x 11.00

x小计 31.00

8 y 20.00

y小计 20.00

6 f 20.00

12 f 13.00

f小计 84.00

5 e 20.00

10 e 12.00

e小计 32.00

3 m 14.00

m小计 130.00

4 n 13.00

n小计 13.00

1 a 13.00

a小计 156.00

9 z 20.00

z小计 20.00

2 b 20.00

b小计 40.00

总计 196.00

实现程序

-- 示例数据

CREATE TABLE t1(

id char(1),

parentid char(1)

);

INSERT t1

SELECT 'm', 'a' UNION ALL

SELECT 'n', 'a' UNION ALL

SELECT 'e', 'm' UNION ALL

SELECT 'f', 'm' UNION ALL

SELECT 'x', 'f' UNION ALL

SELECT 'y', 'f' UNION ALL

SELECT 'z', 'b';

CREATE TABLE t2(

row int,

id char(1),

amount decimal(10, 2)

);

INSERT t2

SELECT '1', 'a', '13.00' UNION ALL

SELECT '2', 'b', '20.00' UNION ALL

SELECT '3', 'e', '20.00' UNION ALL

SELECT '4', 'f', '20.00' UNION ALL

SELECT '5', 'x', '20.00' UNION ALL

SELECT '6', 'y', '20.00' UNION ALL

SELECT '7', 'z', '20.00' UNION ALL

SELECT '8', 'e', '12.00' UNION ALL

SELECT '9', 'x', '11.00' UNION ALL

SELECT '10', 'f', '13.00';

GO

-- 统计

-- 逐级汇总

declare @l int

set @l=1

select

A.[id],

[pid] = A.parentid,

[sumnum] = SUM(B.amount),

level=case

when exists(select * from t1 where parentid=a.[id])

then @l-1 else @l end

into [#]

from t1 A

LEFT JOIN t2 B

ON A.id = B.id

GROUP BY A.id, A.parentid;

if @@row/42852.htm target=_blank >count>0

create index IDX_#_id_pid on [#]([id],[pid])

else

set @l=999

while @@rowcount>0 or @l=1

begin

set @l=@l+1

update a set level=@l,[sumnum]=isnull(a.[sumnum],0)+isnull(b.[sumnum],0)

from [#] a,(

select aa.pid,[sumnum]=sum(aa.[sumnum])

from [#] aa,(

select distinct [pid] from [#]

where level=@l-1

)bb where aa.[pid]=bb.[pid]

AND NOT EXISTS(

SELECT * FROM [#] WHERE [PID]=aa.[PID] AND [Level]=0)

GROUP BY aa.[PID]

having sum(case when aa.level=0 then 1 else 0 end)=0

)b where a.[id]=b.[pid]

end

-- 最终结果

SELECT

row = CASE

WHEN GROUPING(A.row) = 0 THEN RTRIM(A.row)

ELSE N''

END,

id = CASE

WHEN GROUPING(A.row) = 0 THEN A.id

WHEN GROUPING(A.id) = 0 THEN A.id + '小计'

ELSE N'总计'

END,

amount = CASE

WHEN GROUPING(A.row) = 0 THEN SUM(A.amount)

WHEN GROUPING(A.id) = 0 THEN ISNULL((SELECT SUM(B.sumnum) FROM # B WHERE A.id = B.id), SUM(A.amount))

ELSE SUM(A.amount)

END

FROM t2 A

GROUP BY A.id, A.row WITH ROLLUP;

drop table [#]

GO

DROP TABLE t1, t2;

/*-- 结果

row id amount

------------ ----- ---------------------------------------

1 a 13.00

a小计 13.00

2 b 20.00

b小计 20.00

3 e 20.00

8 e 12.00

e小计 32.00

4 f 20.00

10 f 13.00

f小计 84.00

5 x 20.00

9 x 11.00

x小计 31.00

6 y 20.00

y小计 20.00

7 z 20.00

z小计 20.00

总计 169.00

(18 行受影响)

--*/

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

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

相关文章

Altium Designer哪里下载和导入元件库_图文教程

http://jingyan.baidu.com/article/46650658064621f549e5f88f.html转载于:https://www.cnblogs.com/Ph-one/p/4397460.html

python3 logging com1_python-logging-基础(1)

在执行用例的时候,往往会遇到各种问题,遇到问题后很难去定位import loggingclass Logs:def __init__(self,filepath,name):#self.namename#self.filepathfilepathself.configRead_config(Config_Http)#重新定义日志名字self.loggerlogging.getLogger(sel…

拷贝人家的

TCP server端 #include "stdafx.h" #include <stdio.h> #include <winsock2.h>#pragma comment(lib,"ws2_32.lib")int main(int argc, char* argv[]) {//初始化WSAWORD sockVersion MAKEWORD(2,2);WSADATA wsaData;if(WSAStartup(sockVersion…

python问题解决方案_Python安装、遇到的问题及解决方案,python,和,方法

Python安装&#xff1a;先在官网下载你需要的Python版本&#xff0c;我这边下载的是Python3.8&#xff0c;下载完是一个exe文件&#xff0c;直接双击安装即可&#xff0c;注意勾选“add python 3.8 to path”安装后遇到的问题&#xff1a;1.安装完成后在cmd中输入Python查看版本…

python 复数求模_Python基础语法知识汇总(学习党的最爱!)

本文章包含了Python一系列基本知识&#xff0c;其中包括&#xff1a;基本数据类型&#xff08;整数&#xff0c;浮点数&#xff0c;复数&#xff0c;字符串&#xff09;&#xff1b;分支语句&#xff1b;异常处理&#xff1b;函数&#xff1b;局部变量与全局变量&#xff1b;递…

JAVA装mysql_已经安装了mysql,怎么能在java程序里使用SQL?

展开全部1、安装62616964757a686964616fe4b893e5b19e31333335323437SQLServer2000安装SQLServer2000补丁SP3安装SQLServer2000 for SP3的驱动程序(先打补丁sp3&#xff0c;再安装针对sp3的驱动程序&#xff0c;安装补丁时&#xff0c;为保险起见&#xff0c;两种验证方式的都装…

用对工具,抖音、某站视频轻松下载~

相信大部分小伙伴都有过这样的困扰&#xff0c;平时我们在刷短视频的时候就发现一段我们需要的视频。想下载时才发现&#xff0c;“保存”按钮是灰色的。 这个时候我们可以通过复制视频链接的方式来下载视频。下面给大家介绍四种万能视频下载工具&#xff0c;大家记得点赞收藏再…

数字的空洞 水 南邮NOJ 1071

数字的空洞 时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte 总提交 : 209 测试通过 : 120 题目描述 在个位数中&#xff1a;0&#xff0c;4&#xff0c;6&#xff0c;8&#xff0c;9有一个共同的特征&#xff1a;数形上存在空洞&…

bzoj 1257: [CQOI2007]余数之和sum 数论

1257: [CQOI2007]余数之和sum Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id1257Description 给出正整数n和k&#xff0c;计算j(n, k)k mod 1 k mod 2 k mod 3 … k mod n的值&#xff0c;其中k mod i表示k除以i的…

flask 上传excel 前端_flask-restful编写上传图片api

Flask-RESTful是用于快速构建REST API的Flask扩展。我最近在使用Flask-Restful Vue.js写一个轻量博客时有一个前端后端上传图片的需求。在Flask-Restful的官方文档中并没有相关的内容。下面是我谷歌查找资料的总结。引入FileStorageflask-restful的参数解析中并没有文件类型&a…

Hibernate merge和update的区别

今天做了个测试&#xff0c;写了个测试用例来看看merge与update时控制台打印出来的日志有什么不一样。实体bean很简单&#xff0c;就id和name两个字段&#xff0c;接下来分别给出以下几种测试情形的控制台日志内容&#xff1a; 1. 数据库记录已存在&#xff0c;更改person的nam…

qdir 类似工具_qdir 类似工具_支持 Win8.1,全能资源管理器 Q-Dir 5.74 发布

Q-Dir是一款帮助用户管理本地文件和文档的工具。支持快速访问定位本地磁盘、网络驱动器、USB移动设备及其他存储设备中的文件或文档。依靠强大的Quadro-View技术&#xff0c;使得Q-Dir成为一款优秀的文件管理工具。Q-Dir文件管理软件特色&#xff1a;• 收藏夹&#xff1a;快速…

面试题:求所占字符

/* 在32位系统下&#xff0c;分别定义如下两个变量&#xff1a;char *p[10],char(*p1)[10],sizeof(p),sizeof(p1)分别值为___________。 */ #include <stdio.h> #include <stdlib.h>void main() {char *p[10],(*p1)[10],p2[10],p3;printf("%d,%d,%d,%d,%d,%d&…

mysql数据库函数转义函数_MySql数据库-查询、插入数据时转义函数的使用

最近在看一部php的基础视频教程&#xff0c;在做案例的时&#xff0c;当通过用户名查询用户信息的时候&#xff0c;先使用了转义函数对客户提交的内容进行过滤之后再交给sql语句进行后续的操作。虽然能看到转义函数本身的作用&#xff0c;但是仍然有一些疑惑。疑惑一&#xff1…

python pyquery安装_win7下python安装pyquery

安装pyquery之前首先要明确一点&#xff0c;easyinstall 是一款python包管理器&#xff0c;类似于node的npm&#xff0c;用于安装python的扩展包&#xff0c;它安装的包是以*.egg的方式。要安装pq需要经历以下步骤&#xff1a;1&#xff1a;下载easyinstall设置环境变量&#x…

DbContext 和ObjectContext两者的区别

一是ObjectContext是一种模型优先的开发模式&#xff0c;DbContext是代码优先的开发模式。这是两者最根本的区别。 同时两者之间可以相互转换&#xff1a; 下面给出转换的例子 1 DbContext转为ObjectContext using System.Data.Entity.Infrastructure ObjectContext context (…

mysql的简介与优点_SQL 简介以及MySQL的优点

原文摘自&#xff1a;W3school。还有一些是本人自己整理的SQL 是用于访问和处理数据库的标准的计算机语言。什么是SQL&#xff1f;SQL 指结构化查询语言SQL 使我们有能力访问数据库SQL 是一种ANSI的标准计算机语言注&#xff1a;ANSI&#xff0c;美国国家标准化组织SQL能做什么…

反射之关于MethodInfo的使用

1、MethodInfo类是在System.Reflection命名空间底下&#xff0c;既然是在Reflection空间底下。故名思议关于反射相关的操作&#xff0c;其中比较重要的方法是Invoke()方法&#xff0c;它是加载相同程序集的方法。简单用法 string command "AnnouncementSave"; //通过…

vue添加定位功能_Vue如何实现锚点定位功能?

整个链路应该是这样的&#xff0c;用户在消息中心中看到回复自己的信息&#xff0c;点进去后会跳到视频播放页面&#xff0c;页面url中会带上此次消息的replyId(就简称rid吧)&#xff0c;然后接下来的问题就是有两个&#xff0c;一个是评论本身是分页的&#xff0c;你的评论不一…

织梦直接往数据库写入数据

x: 不是必须的 1: 值为1 0: 值为0转载于:https://www.cnblogs.com/bushe/p/4425298.html