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数据库多级分类汇总_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 ...

  2. mysql 查出二级分类_sql多级分类的级联查询

    CREATE TABLE t_category ( ID INT IDENTITY(1,1) PRIMARY KEY, Name VARCHAR(40) NOT NULL, ParentID INT ...

  3. mysql 多级分类_数据库多级分类相关行排列在一起的查询

    我用的数据库是mysql. 在做后台分类管理的时候遇到这样一个需求 就是将分类以树形菜单的方式展现出来. 我的导航栏的表在数据库中是这样的 然后,经过初步的sql查询,实现的效果是下面这样的,下边有s ...

  4. mysql 查询多级类别_SQL处理多级分类,查询结果呈树形结构

    对于多级分类常规的处理方法,很多程序员可能是用程序先读取一级分类记录,然后通过一级分类循环读取下面的子分类 这样处理的弊端是:如果数据量大,子分类很多,达到4级以上,这方法处理极端占用数据库连接池 对 ...

  5. 什么是计算机嵌套分类汇总,excel嵌套分类汇总 Excel表格中创建嵌套分类汇总和查看嵌套分类汇总明细的方法...

    excel嵌套分类汇总 Excel表格中创建嵌套分类汇总和查看嵌套分类汇总明细的方法,我们在工作中会遇到很多文章,像excel嵌套分类汇总这类问题应该大家也都遇到过吧,今天这篇excel嵌套分类汇总 ...

  6. 计算机一级表格分类汇总怎么弄,多张word表格分类汇总 word表格分类汇总

    Excel多张表格数据自动汇总到一张表上方法? 如何将excel多张数据汇总在一个表中分为以下几步:1.工作簿中有多张工作表,A列和B列都有类似的数据,行数不同. 2.选中"汇总" ...

  7. R语言使用epiDisplay包的logistic.display函数获取二分类logistic回归模型的汇总统计信息(自变量初始和调整后的优势比及置信区间,回归系数的Wald检验的p值、简化汇总结果

    R语言使用epiDisplay包的logistic.display函数获取二分类logistic回归模型的汇总统计信息(自变量初始和调整后的优势比及置信区间,回归系数的Wald检验的p值.自变量的似然 ...

  8. Java IO流学习总结(一)—— IO流分类和常用IO流汇总

    Java IO流学习总结(一)-- IO流分类和常用IO流汇总 IO流的分类: - 按流向分类:输入流.输出流 - 按操作对象分类:字节流.字符流 - 按功能分类:节点流.处理流 IO流的设计模式为装 ...

  9. 计算机分类汇总表格,Excel分类汇总使用全攻略

    利用Excel进行数据分析时,需要根据某个字段进行快速汇总数据,例如在统计学生成绩时,希望查看各班各门课程的平均成绩,应该怎么做呢? 这就需要使用Excel的分类汇总功能,分类汇总就是把数据表中的数据 ...

最新文章

  1. 楼燚(yì)航的blog URL
  2. 【Groovy】集合遍历 ( 集合中有集合元素时调用 flatten 函数拉平集合元素 | 代码示例 )
  3. 深入浅出 Java Concurrency (33): 线程池 part 6 线程池的实现及原理 (1)[转]
  4. hdu 4352 XHXJ's LIS
  5. substringToIndex substringFromIndex
  6. 计算机多重网络intnet,南昌大学计算机网络实验(全).doc
  7. insert时调用本身字段_python3调用企业微信api!开发一款属于自己的企业微信
  8. JAVA Swing GUI设计 WindowBuilder Pro Container使用大全7——JDesktopPane使用
  9. oracle xtts 测试,XTTS 跨平台表空间迁移测试
  10. Linux服务器安全加固
  11. 2020-12-09
  12. C语言卡路里程序,燃烧app的卡路里--app瘦身之路
  13. php图片上传功能,实时显示上传的图片
  14. 手写简单的HashMap(jdk1.7)
  15. 计算机论文结束语致谢,毕业论文致谢结束语3篇
  16. JZOJ3426. 【NOIP2013模拟】封印一击 (2017.8B组)
  17. 【Nas/群晖/服务器】FRP内网穿透实现外网访问
  18. python自己做电子词典_利用PyQt5制作电子词典
  19. HTTP代理与SOCKS代理的区别
  20. JAVA核心知识点--使用org.json.JSONObject处理Json数据

热门文章

  1. mysql definer设置为root_mysql如何修改所有的definer
  2. Java 修改文件最后的创建日期
  3. python修改文件格式为unix_软件测试技术之如何用python在Windows系统下,生成UNIX格式文件...
  4. c++数字金字塔_“资金管理是投资最大的秘密”(超级干货),一生死记“金字塔加仓减仓法”,最安全稳健的操盘法方式!...
  5. 【课题总结】OpenCV 抠图项目实战(11)算法实验平台
  6. 第一个鸿蒙程序“hello world“
  7. 买电脑主要看什么配置_买笔记本电脑主要看什么? 配置要什么样的才算好?...
  8. 学python开发必须要会wsgi么_学python着几个要搞清楚WSGI和uWSGI区别
  9. 关于web服务器性能书籍,图书商城系统的Web服务器性能优化研究与实现
  10. Python中字符串如何定义简单举例