读书人

用SQL统计出父级跟子级的数据,可能有3

发布时间: 2013-04-02 12:35:26 作者: rapoo

用SQL统计出父级和子级的数据,可能有3层或者4层以上的,为空是最上层的区域
区域 销售额 上级区域
001 100.0 005
002 200.0 005
003 100.0 005
004 100.0 005
005 200.0 01
01 50.0 sql
[解决办法]

----------------------------
-- Author :DBA_Huangzj()
-- Date :2013-03-29 15:03:48
-- 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)
--
----------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go
create table [huang]([区域] varchar(3),[销售额] INT ,[上级区域] varchar(3))
insert [huang]
select '001',100.0,'005' union all
select '002',200.0,'005' union all
select '003',100.0,'005' UNION all
select '004',100.0,'005' union all
select '005',200.0,'01' union all
select '01',50.0,null
--------------开始查询--------------------------
;WITH cte AS --产生一个级别用于后续使用
(
SELECT 区域,销售额,[上级区域],0 AS [级别]
FROM huang
WHERE [上级区域] IS NULL
UNION ALL
SELECT b. 区域,b.销售额,b.[上级区域],a.级别+1 AS 级别
FROM cte a INNER JOIN huang b ON b.[上级区域]=a.[区域]
)
--计算非最低级别的总数,即需要汇总的数据
SELECT 区域,(SELECT SUM(销售额) FROM cte a WHERE b.级别<=a.级别 ),[上级区域]
FROM cte b
WHERE 级别<(SELECT MAX(级别) FROM cte)
UNION ALL
--最低级别的数据不汇总
SELECT 区域,销售额,[上级区域]
FROM cte b
WHERE 级别 IN (SELECT MAX(级别) FROM cte)
----------------结果----------------------------
/*
区域 上级区域
---- ----------- ----
01 750 NULL
005 700 01
001 100 005
002 200 005
003 100 005
004 100 005
*/

[解决办法]
引用:
Quote: 引用:
你的这个跟6楼是一样的,有问题我改下数据就出问题了
select '001',100.0,'005' union all
select '002',200.0,'005' union all
select '003',100.0,'005' union all
select '004',100.0,'01' ……

with tb(区域,销售额,上级区域)
as(
select '001',100.0,'005' union all


select '002',200.0,'005' union all
select '003',100.0,'005' union all
select '004',100.0,'01' union all
select '005',200.0,'01' union all
select '01',50.0,null
),
cte as(
select *,lv=cast(0 as int),qy=cast(','+区域+',' as varchar(2000)) from tb where 上级区域 is null union all
select t.*,lv=cast(c.lv+1 as int),qy=cast(c.qy+rtrim(t.区域)+',' as varchar(2000)) from tb t join cte c on t.上级区域=c.区域
)
select 区域,销售额,下级销售额=(select isnull(sum(销售额),0) from cte c2 where c1.lv<c2.lv and charindex(','+c1.区域+',',c2.qy)>0),上级区域 from cte c1

读书人网 >SQL Server

热点推荐