首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

伸伸你的手,小小疑点,看看 CTE 递归

2013-06-26 
伸伸你的手,小小问题,看看 CTE 递归上面是要实现的效果图!这个图是数据表的内容这个图是自己写的,但是效果

伸伸你的手,小小问题,看看 CTE 递归
伸伸你的手,小小疑点,看看 CTE 递归

上面是要实现的效果图!


伸伸你的手,小小疑点,看看 CTE 递归

这个图是数据表的内容

伸伸你的手,小小疑点,看看 CTE 递归

这个图是自己写的,但是效果达不到,大神指定, 行业数据 递归
[解决办法]
有数据就好办

----------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-05-29 11:48:33
-- Version:
--      Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 
--Jun 17 2011 00:54:03 
--Copyright (c) Microsoft Corporation
--Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1, v.721)
--
----------------------------
--> 测试数据:[会计科目]
if object_id('[会计科目]') is not null drop table [会计科目]
go 
create table [会计科目]([ID] int,[名字] varchar(14),[父级ID] int,[累计金额] numeric(6,2),[是否系统科目] int)
insert [会计科目]
select 1,'【收入类】',0,0.00,1 union all
select 2,'【支出类】',0,0.00,1 union all
select 3,'【利润】',0,100.00,1 union all
select 4,'『销售收入』',1,400.00,1 union all
select 5,'『其他收入』',1,0.00,1 union all
select 6,'『采购支出』',2,1500.00,1 union all
select 7,'『其他支出』',2,0.00,1 union all
select 8,'其他收入',5,0.00,0 union all
select 9,'其他…',5,0.00,0 union all
select 10,'其他支出',7,0.00,0 union all
select 11,'其他…',7,0.00,0 union all
select 12,'『商品类收入』',1,0.00,0 union all
select 13,'『商品类支出』',2,0.00,0 union all
select 14,'报溢收入',12,0.00,0 union all
select 15,'报损支出',13,0.00,0
--------------开始查询--------------------------

;WITH T_会计科目 AS ( 
SELECT [ID],[名字],[父级ID] ,[ID] AS ORDERID
FROM [会计科目]  
WHERE [父级ID]=0 
UNION ALL 
SELECT a.[ID],a.[名字],a.[父级ID] , a.[父级ID]
FROM [会计科目] a INNER JOIN T_会计科目 b ON a.[父级ID]=b.id 

SELECT [ID],[名字],[父级ID] 
FROM T_会计科目
ORDER BY ORDERID
----------------结果----------------------------
/* 
ID          名字             父级ID
----------- -------------- -----------
1           【收入类】          0
4           『销售收入』         1
5           『其他收入』         1
12          『商品类收入』        1


2           【支出类】          0
6           『采购支出』         2
7           『其他支出』         2
13          『商品类支出』        2
3           【利润】           0
8           其他收入           5
9           其他…            5
10          其他支出           7
11          其他…            7
14          报溢收入           12
15          报损支出           13
*/


[解决办法]
引用:
有数据就好办
----------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-05-29 11:48:33
-- Version:
--      Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 
--Jun 17 2011 00:54:03 
--Copyright (c) Microsoft Corporation
--Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1, v.721)
--
----------------------------
--> 测试数据:[会计科目]
if object_id('[会计科目]') is not null drop table [会计科目]
go 
create table [会计科目]([ID] int,[名字] varchar(14),[父级ID] int,[累计金额] numeric(6,2),[是否系统科目] int)
insert [会计科目]
select 1,'【收入类】',0,0.00,1 union all
select 2,'【支出类】',0,0.00,1 union all
select 3,'【利润】',0,100.00,1 union all
select 4,'『销售收入』',1,400.00,1 union all
select 5,'『其他收入』',1,0.00,1 union all
select 6,'『采购支出』',2,1500.00,1 union all
select 7,'『其他支出』',2,0.00,1 union all
select 8,'其他收入',5,0.00,0 union all
select 9,'其他…',5,0.00,0 union all
select 10,'其他支出',7,0.00,0 union all
select 11,'其他…',7,0.00,0 union all
select 12,'『商品类收入』',1,0.00,0 union all
select 13,'『商品类支出』',2,0.00,0 union all
select 14,'报溢收入',12,0.00,0 union all
select 15,'报损支出',13,0.00,0
--------------开始查询--------------------------

;WITH T_会计科目 AS ( 
SELECT [ID],[名字],[父级ID] ,[ID] AS ORDERID
FROM [会计科目]  
WHERE [父级ID]=0 
UNION ALL 
SELECT a.[ID],a.[名字],a.[父级ID] , a.[父级ID]
FROM [会计科目] a INNER JOIN T_会计科目 b ON a.[父级ID]=b.id 

SELECT [ID],[名字],[父级ID] 
FROM T_会计科目


ORDER BY ORDERID
----------------结果----------------------------
/* 
ID          名字             父级ID
----------- -------------- -----------
1           【收入类】          0
4           『销售收入』         1
5           『其他收入』         1
12          『商品类收入』        1
2           【支出类】          0
6           『采购支出』         2
7           『其他支出』         2
13          『商品类支出』        2
3           【利润】           0
8           其他收入           5
9           其他…            5
10          其他支出           7
11          其他…            7
14          报溢收入           12
15          报损支出           13
*/



----------------------
你如果觉得顺序不对,你可以自己把上面那段
select 1,'【收入类】',0,0.00,1 union all
select 2,'【支出类】',0,0.00,1 union all
select 3,'【利润】',0,100.00,1 union all
select 4,'『销售收入』',1,400.00,1 union all
select 5,'『其他收入』',1,0.00,1 union all
select 6,'『采购支出』',2,1500.00,1 union all

=====
重新写一遍按你想要的顺序来写。
==================================

其实这个可以通过:创建临时表,循环查询是否有子类,无则直接查同类的下一级。。相关的可以看一下:数据结构方面的,“树”
[解决办法]

create table ha
(ID int, 名字 varchar(20), 父级ID int, 累计金额 decimal(8,2), 是否系统科目 int)

insert into ha
 select 1, '【收入类】', 0, 0.00, 1 union all
 select 2, '【支出类】', 0, 0.00, 1 union all
 select 3, '【利润】', 0, 100.00, 1 union all
 select 4, '『销售收入』', 1, 400.00, 1 union all
 select 5, '『其他收入』', 1, 0.00, 1 union all
 select 6, '『采购支出』', 2, 1500.00, 1 union all
 select 7, '『其他支出』', 2, 0.00, 1 union all
 select 8, '其他收入', 5, 0.00, 0 union all
 select 9, '其他…', 5, 0.00, 0 union all


 select 10, '其他支出', 7, 0.00, 0 union all
 select 11, '其他…', 7, 0.00, 0 union all
 select 12, '『商品类收入』', 1, 0.00, 0 union all
 select 13, '『商品类支出』', 2, 0.00, 0 union all
 select 14, '报溢收入', 12, 0.00, 0 union all
 select 15, '报损支出', 13, 0.00, 0


with t as
(select ID,名字,累计金额,父级ID,ID 'ZID',1 'lv' from ha where 父级ID=0
 union all
 select b.ID,b.名字,b.累计金额,b.父级ID,a.ZID,a.lv+1 'lv'
  from t a
  inner join ha b on a.ID=b.父级ID
)
select ID,cast(replicate('     ',lv)+名字 as varchar(50)) '名字',累计金额
 from t
 order by ZID,ID

/*
ID          名字                                                   累计金额
----------- -------------------------------------------------- ---------------------------------------
1                【收入类】                                         0.00
4                     『销售收入』                                  400.00
5                     『其他收入』                                  0.00
8                          其他收入                                0.00
9                          其他…                                0.00
12                    『商品类收入』                                0.00
14                         报溢收入                                 0.00
2                【支出类】                                          0.00


6                     『采购支出』                                  1500.00
7                     『其他支出』                                   0.00
10                         其他支出                                 0.00
11                         其他…                                 0.00
13                    『商品类支出』                                 0.00
15                         报损支出                                 0.00
3                【利润】                                           100.00

(15 row(s) affected)
*/

热点排行
Bad Request.