这样的SQL应该怎么写

qq_26905003 2016-12-22 11:44:11
假如有这样一张表:
ID Name Score ParentID
1 战一 101 0
2 战二 102 1
3 战三 103 1
4 战四 104 3
6 战五 105 0
7 战五 105 6
我的意思说要根据父级ID分组,比如我要统计Count(0),和Sum(Score)
要怎么把ID1 2 3 4 分成一组,把6 7分成一组,总而言之就是根据ParentID 为0的分组,
并且ParentID不为0行的也要统计进去,求各路大神指点
...全文
537 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwfxgm 2016-12-24
  • 打赏
  • 举报
回复
引用 5 楼 roy_88 的回复:
指定临时命名的结果集,这些结果集称为公用表表达式 (CTE)。 等同于内嵌表把语句生成别名的结果集
实际中,这个好像用不上啊。一般都是用视图做好。再引用视图。是不是这样?
道素 2016-12-22
  • 打赏
  • 举报
回复
你是想统计每个ID下所有子ID的数量和score合吗?试下这个,现在是统计所有ID,如果仅想统计一个,在CTE第一条价格条件就行


;WITH tb(ID,Name,Score,ParentID)AS(
    SELECT 1,N'战一',101,0 UNION ALL
    SELECT 2,N'战二',102,1 UNION ALL
    SELECT 3,N'战三',103, 1 UNION ALL
    SELECT 4,N'战四',104,3 UNION ALL
    SELECT 6,N'战五',105,0 UNION ALL
    SELECT 7,N'战五',105,6
),cte AS (
    SELECT ID AS MainID, ID,Name,Score,ParentID FROM tb
    UNION ALL
    SELECT cte.MainID,tb.ID,tb.Name,tb.Score,tb.ParentID FROM tb INNER JOIN cte ON cte.ID=tb.ParentID
 )
 SELECT cte.MainID,COUNT(0),SUM(Score) FROM cte
 GROUP BY cte.MainID

/*
MainID                  
----------- ----------- -----------
1           4           410
2           1           102
3           2           207
4           1           104
6           2           210
7           1           105
*/
中国风 2016-12-22
  • 打赏
  • 举报
回复
e.g.
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
 
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([ID] int,[Name] nvarchar(22),[Score] int,[ParentID] int)
Insert #T
select 1,N'战一',101,0 union all
select 2,N'战二',102,1 union all
select 3,N'战三',103,1 union all
select 4,N'战四',104,3 union all
select 6,N'战五',105,0 union all
select 7,N'战五',105,6
GO
;WITH CTET AS
(
Select *,ID2=ID,Name2=Name from #T WHERE ParentID=0
UNION ALL
SELECT a.*,b.ID2,b.Name2 FROM #T AS a INNER JOIN CTET AS b ON b.ID=a.ParentID
)
SELECT ID2,Name2,SUM(Score) AS Scroe,COUNT(*) AS con FROM CTET GROUP BY Name2,ID2
/*
ID2	Name2	Scroe	con
1	战一	410	4
6	战五	210	2*/
中国风 2016-12-22
  • 打赏
  • 举报
回复
指定临时命名的结果集,这些结果集称为公用表表达式 (CTE)。 等同于内嵌表把语句生成别名的结果集
qq_26905003 2016-12-22
  • 打赏
  • 举报
回复
引用 1 楼 roy_88 的回复:
e.g.
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
 
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([ID] int,[Name] nvarchar(22),[Score] int,[ParentID] int)
Insert #T
select 1,N'战一',101,0 union all
select 2,N'战二',102,1 union all
select 3,N'战三',103,1 union all
select 4,N'战四',104,3 union all
select 6,N'战五',105,0 union all
select 7,N'战五',105,6
GO
;WITH CTET AS
(
Select *,ID2=ID,Name2=Name from #T WHERE ParentID=0
UNION ALL
SELECT a.*,b.ID2,b.Name2 FROM #T AS a INNER JOIN CTET AS b ON b.ID=a.ParentID
)
SELECT ID2,Name2,SUM(Score) AS Scroe,COUNT(*) AS con FROM CTET GROUP BY Name2,ID2
/*
ID2	Name2	Scroe	con
1	战一	410	4
6	战五	210	2*/
;WITH CTET AS ( Select *,ID2=ID,Name2=Name from #T WHERE ParentID=0 UNION ALL SELECT a.*,b.ID2,b.Name2 FROM #T AS a INNER JOIN CTET AS b ON b.ID=a.ParentID ) SELECT ID2,Name2,SUM(Score) AS Scroe,COUNT(*) AS con FROM CTET GROUP BY Name2,ID2 大神这段代码不怎么懂,ctet里面的ctet是什么。
  • 打赏
  • 举报
回复
mark 一下

590

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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