递归累计下级数量,求存储过程或一条SQL语句,带测试数据

rd16 2018-03-15 09:13:18
CREATE TABLE [dbo].[Table](
[id] [int] NULL,
[fid] [int] NULL,
[Name] [nchar](10) NULL,
[Number] [int] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[Table] ([id], [fid], [Name], [Number]) VALUES (1, 0, N'A ', 5)
INSERT [dbo].[Table] ([id], [fid], [Name], [Number]) VALUES (2, 1, N'B ', 7)
INSERT [dbo].[Table] ([id], [fid], [Name], [Number]) VALUES (3, 1, N'C ', 3)
INSERT [dbo].[Table] ([id], [fid], [Name], [Number]) VALUES (4, 3, N'D ', 5)
INSERT [dbo].[Table] ([id], [fid], [Name], [Number]) VALUES (5, 2, N'E ', 2)



id跟fid递归,我想得到以下结果

A=A+B+C+E+D
B=B+E
--------------------------------------------------------------------------

ID 名字 总数量
1 A 22
2 B 9
3 C 8
4 D 5
...全文
487 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 版主 2018-03-15
  • 打赏
  • 举报
回复
;WITH ctea AS (
SELECT *,[Table].Name AS pname FROM [Table]
UNION ALL
SELECT [Table].id ,
[Table].fid ,
[Table].Name ,
[Table].Number,
ctea.pname
FROM [Table]
JOIN ctea ON ctea.id = [Table].fid
)
SELECT pname,SUM(Number) AS Number FROM ctea GROUP BY pname



吉普赛的歌 版主 2018-03-15
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('Table')IS NOT NULL DROP TABLE [Table]
GO
CREATE TABLE [dbo].[Table](
    [id] [int] NULL,
    [fid] [int] NULL,
    [Name] [nchar](10) NULL,
    [Number] [int] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[Table] ([id], [fid], [Name], [Number]) VALUES (1, 0, N'A         ', 5)
INSERT [dbo].[Table] ([id], [fid], [Name], [Number]) VALUES (2, 1, N'B         ', 7)
INSERT [dbo].[Table] ([id], [fid], [Name], [Number]) VALUES (3, 1, N'C         ', 3)
INSERT [dbo].[Table] ([id], [fid], [Name], [Number]) VALUES (4, 3, N'D         ', 5)
INSERT [dbo].[Table] ([id], [fid], [Name], [Number]) VALUES (5, 2, N'E         ', 2)
GO
IF OBJECT_ID('dbo.Fun_GetSubList') IS NOT NULL
DROP FUNCTION dbo.Fun_GetSubList
GO
-- =============================================
-- Author:		yenange
-- Create date: 2018-03-15
-- Description:	得到id及所有子记录的集合列表
-- =============================================
CREATE FUNCTION dbo.Fun_GetSubList
(	
	@id INT
)
RETURNS TABLE 
AS
RETURN 
(
	WITH cte AS(
		SELECT id,fid,[Name],[Number] FROM [Table] WHERE id=@id
		UNION ALL
		SELECT t.id,t.fid,t.[Name],t.[Number]
		FROM [TABLE] AS t INNER JOIN cte ON t.fid=cte.id 
	)
	SELECT * FROM cte
)
GO
SELECT  t.id
,t.fid
,t.[Name]
,(SELECT SUM(f.Number) FROM dbo.Fun_GetSubList(t.id) AS f) AS [total]
FROM [Table] AS t
 
/*
id	fid	Name	total
1	0	A         	22
2	1	B         	9
3	1	C         	8
4	3	D         	5
5	2	E         	2
*/

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧