sql CTE 统计

zxl19890412qq 2017-07-26 06:47:52
我用CTE递归了一个树形结构,我想问,我怎么把树形结构的第一层下的所有层的的子集中的 某个字段的和 求出来?

id pid shu
1 0 0
2 1 1
3 2 1
4 2 1
5 2 1
6 3 1
7 3 1


请问 怎么 统计 能出来 如下结果

id pid shu
1 0 6
...全文
131 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxl19890412qq 2017-07-27
  • 打赏
  • 举报
回复
引用 7 楼 sinat_28984567 的回复:
[quote=引用 6 楼 zxl19890412qq 的回复:] [quote=引用 5 楼 sinat_28984567 的回复:] [quote=引用 4 楼 zxl19890412qq 的回复:] [quote=引用 3 楼 sinat_28984567 的回复:]
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([id] int,[pid] int,[shu] int)
Insert #T
select 1,0,0 union all
select 2,1,1 union all
select 3,2,1 union all
select 4,2,1 union all
select 5,2,1 union all
select 6,3,1 union all
select 7,3,1
Go
--测试数据结束
;WITH cte AS (
Select *,id AS fullid from #T WHERE id = 1
UNION ALL
SELECT #T.*,cte.fullid FROM #T JOIN cte ON cte.id = #T.pid
)
SELECT  fullid AS id ,
        0 AS pid ,
        SUM(cte.shu) AS shu
FROM    cte
GROUP BY fullid;
如果我在CTE里没有条件的话,我想汇总,会不回出现多出来好多数的问题?[/quote] 会,那样就会汇总每个节点以及其子节点的和[/quote] 有什么办法解决吗?[/quote] 加上条件……还有楼主说的这个条件是什么意思?[/quote] 大体的意思我看明白了,我自己先研究一下,有什么不懂的我在请教啊!谢谢,这个搞完结贴给你分
二月十六 2017-07-27
  • 打赏
  • 举报
回复
引用 6 楼 zxl19890412qq 的回复:
[quote=引用 5 楼 sinat_28984567 的回复:] [quote=引用 4 楼 zxl19890412qq 的回复:] [quote=引用 3 楼 sinat_28984567 的回复:]
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([id] int,[pid] int,[shu] int)
Insert #T
select 1,0,0 union all
select 2,1,1 union all
select 3,2,1 union all
select 4,2,1 union all
select 5,2,1 union all
select 6,3,1 union all
select 7,3,1
Go
--测试数据结束
;WITH cte AS (
Select *,id AS fullid from #T WHERE id = 1
UNION ALL
SELECT #T.*,cte.fullid FROM #T JOIN cte ON cte.id = #T.pid
)
SELECT  fullid AS id ,
        0 AS pid ,
        SUM(cte.shu) AS shu
FROM    cte
GROUP BY fullid;
如果我在CTE里没有条件的话,我想汇总,会不回出现多出来好多数的问题?[/quote] 会,那样就会汇总每个节点以及其子节点的和[/quote] 有什么办法解决吗?[/quote] 加上条件……还有楼主说的这个条件是什么意思?
zxl19890412qq 2017-07-27
  • 打赏
  • 举报
回复
引用 5 楼 sinat_28984567 的回复:
[quote=引用 4 楼 zxl19890412qq 的回复:] [quote=引用 3 楼 sinat_28984567 的回复:]
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([id] int,[pid] int,[shu] int)
Insert #T
select 1,0,0 union all
select 2,1,1 union all
select 3,2,1 union all
select 4,2,1 union all
select 5,2,1 union all
select 6,3,1 union all
select 7,3,1
Go
--测试数据结束
;WITH cte AS (
Select *,id AS fullid from #T WHERE id = 1
UNION ALL
SELECT #T.*,cte.fullid FROM #T JOIN cte ON cte.id = #T.pid
)
SELECT  fullid AS id ,
        0 AS pid ,
        SUM(cte.shu) AS shu
FROM    cte
GROUP BY fullid;
如果我在CTE里没有条件的话,我想汇总,会不回出现多出来好多数的问题?[/quote] 会,那样就会汇总每个节点以及其子节点的和[/quote] 有什么办法解决吗?
二月十六 2017-07-27
  • 打赏
  • 举报
回复
引用 4 楼 zxl19890412qq 的回复:
[quote=引用 3 楼 sinat_28984567 的回复:]
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([id] int,[pid] int,[shu] int)
Insert #T
select 1,0,0 union all
select 2,1,1 union all
select 3,2,1 union all
select 4,2,1 union all
select 5,2,1 union all
select 6,3,1 union all
select 7,3,1
Go
--测试数据结束
;WITH cte AS (
Select *,id AS fullid from #T WHERE id = 1
UNION ALL
SELECT #T.*,cte.fullid FROM #T JOIN cte ON cte.id = #T.pid
)
SELECT  fullid AS id ,
        0 AS pid ,
        SUM(cte.shu) AS shu
FROM    cte
GROUP BY fullid;
如果我在CTE里没有条件的话,我想汇总,会不回出现多出来好多数的问题?[/quote] 会,那样就会汇总每个节点以及其子节点的和
zxl19890412qq 2017-07-27
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([id] int,[pid] int,[shu] int)
Insert #T
select 1,0,0 union all
select 2,1,1 union all
select 3,2,1 union all
select 4,2,1 union all
select 5,2,1 union all
select 6,3,1 union all
select 7,3,1
Go
--测试数据结束
;WITH cte AS (
Select *,id AS fullid from #T WHERE id = 1
UNION ALL
SELECT #T.*,cte.fullid FROM #T JOIN cte ON cte.id = #T.pid
)
SELECT  fullid AS id ,
        0 AS pid ,
        SUM(cte.shu) AS shu
FROM    cte
GROUP BY fullid;
如果我在CTE里没有条件的话,我想汇总,会不回出现多出来好多数的问题?
二月十六 2017-07-26
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([id] int,[pid] int,[shu] int)
Insert #T
select 1,0,0 union all
select 2,1,1 union all
select 3,2,1 union all
select 4,2,1 union all
select 5,2,1 union all
select 6,3,1 union all
select 7,3,1
Go
--测试数据结束
;WITH cte AS (
Select *,id AS fullid from #T WHERE id = 1
UNION ALL
SELECT #T.*,cte.fullid FROM #T JOIN cte ON cte.id = #T.pid
)
SELECT fullid AS id ,
0 AS pid ,
SUM(cte.shu) AS shu
FROM cte
GROUP BY fullid;


zxl19890412qq 2017-07-26
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
你的 CTE 是怎么写的,发上来,在你的基础上改‘
with PTcet as( select UserID,a=1,IntroID,AgentLevelID from #tb union all select ui.UserID,a=2,ui.IntroID,ui.AgentLevelID from PTcet c join CRM.dbo.UserInfo ui on c.UserID=ui.IntroID ) 我是这样写的,大神帮忙看一下,谢谢了
卖水果的net 2017-07-26
  • 打赏
  • 举报
回复
你的 CTE 是怎么写的,发上来,在你的基础上改‘

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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