求一个汇总的SQL

smmajiaa 2012-06-24 06:34:40
id(int), userName(nvchar), parentId(int),status(bit)
1, user1, 1, 1
2, user2, 1, 1
3, user3, 2, 0
4, user4, 3, 0
5, user5, 1, 1
6, user6, 5, 0

输出

id, userName, count(case status ='true' ) t, count(case status ='false' ) f
2, user2, 2, 2
5, user5, 1, 1

把 user1(包含user1)的后代按照 status分类求个数,并按照user1的儿子 分组。
表达力不行,不晓得清楚不^_^

求此输出的SQL。SQL不太熟悉,折腾了很久没有思路...,求大虾们给个SQL吧,在此先谢了。
...全文
100 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
smmajiaa 2012-06-27
  • 打赏
  • 举报
回复
结贴,功能已实现。多谢各位
smmajiaa 2012-06-25
  • 打赏
  • 举报
回复
我已更新 部分说明并开了另一个帖子, 各位大人请移步
http://topic.csdn.net/u/20120625/11/8ed002d5-906b-4b57-98e4-215b50275ac1.html?44367
smmajiaa 2012-06-24
  • 打赏
  • 举报
回复
maco_wang, 请教下排序的目的是什么?排不排感觉没什么区别?
smmajiaa 2012-06-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

SQL code

declare @t table (ID varchar(1),userName varchar(5),parentId varchar(1),status bit)
insert into @t
select 1,'user1',0,1 union all
select 2,'user2',1,1 union all
select 3,'user3',2,0 union ……
[/Quote]

不好意思,输出结果如果包含user1应该是

id, userName, count(case status ='true' ) t, count(case status ='false' ) f
1, user1, 1, 0
2, user2, 1, 2
5, user5, 1, 1

不包含应该是这样,

id, userName, count(case status ='true' ) t, count(case status ='false' ) f
2, user2, 1, 2
5, user5, 1, 1


叶子 2012-06-24
  • 打赏
  • 举报
回复

declare @t table (ID varchar(1),userName varchar(5),parentId varchar(1),status bit)
insert into @t
select 1,'user1',0,1 union all
select 2,'user2',1,1 union all
select 3,'user3',2,0 union all
select 4,'user4',3,0 union all
select 5,'user5',1,1 union all
select 6,'user6',5,0

Declare @p varchar(6) set @p='user1'

select id,userName from @T
where parentId=(select id from @T where userName=@p)
/*
id userName
---- --------
2 user2
5 user5
*/

--不知道后面的 2 2 1 1 是怎么统计出来的...

--深度排序显示处理
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE parentId =0
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM @t a,@t_Level b
WHERE a.parentId=b.ID
AND b.Level=@Level-1
END

--显示结果
SELECT left(SPACE(b.Level*2)+'|--'+a.userName,16) as userName,a.status
FROM @t a,@t_Level b WHERE a.ID=b.ID ORDER BY b.Sort
/*
userName status
-------------------------------- ------
|--user1 1
|--user2 1
|--user3 0
|--user4 0
|--user5 1
|--user6 0
*/

--你给出的结果:user2后面是2真2假
--user5后面是1真1假
--一共是6个数据,但是user1的真为什么算到2里面?

22,210

社区成员

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

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