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 行受影响)

--*/

mysql数据库多级分类汇总_sql多级分类汇总实现介绍相关推荐

  1. mysql数据库约束详解_基于MySQL数据库的数据约束实例及五种完整性约束介绍

    为了防止不符合规范的数据进入数据库,在用户对数据进行插入.修改.删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确.有效.相容. ...

  2. MySQL 数据库备份种类以及常用备份工具汇总

    1,数据库备份种类 按照数据库大小备份,有四种类型,分别应用于不同场合,下面简要介绍一下: 1.1完全备份 这是大多数人常用的方式,它可以备份整个数据库,包含用户表.系统表.索引.视图和存储过程等所有 ...

  3. 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 ...

  4. mysql数据库sql注入原理_SQL注入原理解析以及举例1

    sql注入是指web应用程序对用户输入数据的合法性没有判断,导致攻击者可以构造不同的sql语句来实现对数据库的操作. sql注入漏洞产生满足条件: 1:用户能够控制数据的输入. 2:原本需要执行的代码 ...

  5. MYSQL数据库数据表创建以及数据操作命令汇总

    说明: 1.语句中的小写单词无实意,实际操作时请根据实际情况进行设定或者配置. 2.本文档中的语句属于记忆查询,不适合新手学习之用,新手学习请查询其他文档. 1.数据库创建删除 CREATE DATA ...

  6. mysql数据库sql注入原理_sql注入原理详解(一)

    防止SQL注入: 1.开启配置文件中的magic_quotes_gpc和magic_quotes_runtime设置 2.执行sql语句时使用addslashes进行sql语句转换 3.Sql语句书写 ...

  7. mysql数据库sa默认密码_SQL Server数据库sa密码相关问题的解决方法

    1.如何查找sqlserver的sa密码? 查询分析器,连接时,身份验证使用"使用windows身份验证" 然后,执行: EXEC sp_password NULL, 'NewPa ...

  8. mysql数据库过期了怎么办_SQL数据库超时过期问题的解决方案

    如果SQL的数据库越来越多,有时候会遇到读取超时,死锁等一大堆问题,按经验来说,数据结构设计不合理,经常使用视图等原因都有,那些怎么解决呢?下面看文章 1.由于数据库设计问题造成SQL数据库新增数据时 ...

  9. MySQL数据库篇---对数据库,数据库中表,数据库中表的记录进行添修删查操作---保姆级教程

    MySQL数据库知识点整理,保姆级教程 MySQL数据库存储方式 sql简介 SQL分类 DDL: 数据定义语言 DCL: 数据控制语言 DML:数据操控语言 DQL: 数据查询语言 SQL的使用 S ...

最新文章

  1. 常用String方法
  2. AAAI2021论文:一个激光雷达点云的3D目标单步检测法CIA-SSD
  3. python 在无网络环境下安装包
  4. 2016河北省职称计算机考试试题及答案,2016年最新河北省职称计算机考试试题及答案概要.doc...
  5. mysql 故障处理_MySQL日志故障的处理和分析
  6. 写给 Android 应用工程师的 Binder 原理剖析
  7. openGL光照要点总结
  8. service能去调另外一个service吗_kubernetes的service和pod是如何关联的?
  9. 一文带你读懂单目视觉SLAM数据关联优化
  10. (9)css常用样式--盒子模型
  11. Atitit 查找轮廓 findContours
  12. 点点滴滴——变量对象的产生
  13. Mysql从入门到入魔——6. 表联结、组合查询
  14. 很好的万年历代码。随时可运行
  15. 安卓手机电脑投屏软件【apowermirror、虫洞投屏软件】
  16. LPC1768IAP(详解,有上位机)
  17. VMware安装Redhat虚拟机步骤
  18. 低延时应用 服务器TurboBoost不可得兼?
  19. C语言实验题目[01]
  20. 如何解决QT视频会议窗口在拉伸过程中整个界面闪烁的问题

热门文章

  1. 利用HTML5 Canvas和Javascript实现的蚁群算法求解TSP问题演示
  2. javascript实现的图数据结构的广度优先 搜索(Breadth-First Search,BFS)和深度优先搜索(Depth-First Search,DFS)...
  3. 控制编译文件控制代码质量
  4. (转)如何建立EXCEL2010下拉列表
  5. 用VirtualBox在XP环境下虚拟Ubuntu的过程
  6. DELL 向左走 向右走?(二)
  7. java实现stack search_Java Stack search()用法及代码示例
  8. sql 分号变成多行_SQL(2)
  9. java中velocity定义宏标签_velocity自定义标签和指令(转:zwj)
  10. python实现excel数据透视表_用python建立excel的数据透视表