Area表(地区表):
id AreaName bm parentID
1 湖南省 430000 0
2 长沙 430100 1
3 市辖区 430101 2
4 株洲市 430200 1dw表(单位表)
id AreaID name1
1 2 长沙市食品厂地区表(ID)和单位表(AreaID)关联,Save1库表(开单表):
id dwID dateK moneyK
1 1 2005-8-4 50
2 2 2006-5-7 1000
。
45 1 460Save2库表(收入表):
id dwID dateS SmoneyS
1 1 2005-8-4 50表save1和save2中的ID和单位表中的dwID,关联
我现在要求2005年至2006年长沙地区数据,得以下结果:
其中地区包括下属地区 如:长沙包括"市辖区"地区名 交款数量(开单) 金额(开单) 收入1(总公司) 收入2(交国家) 合计收入 其中(比例分配),收入1=Smoney*50% 收入2=SmoneyS*30拜谢了.
id AreaName bm parentID
1 湖南省 430000 0
2 长沙 430100 1
3 市辖区 430101 2
4 株洲市 430200 1dw表(单位表)
id AreaID name1
1 2 长沙市食品厂地区表(ID)和单位表(AreaID)关联,Save1库表(开单表):
id dwID dateK moneyK
1 1 2005-8-4 50
2 2 2006-5-7 1000
。
45 1 460Save2库表(收入表):
id dwID dateS SmoneyS
1 1 2005-8-4 50表save1和save2中的ID和单位表中的dwID,关联
我现在要求2005年至2006年长沙地区数据,得以下结果:
其中地区包括下属地区 如:长沙包括"市辖区"地区名 交款数量(开单) 金额(开单) 收入1(总公司) 收入2(交国家) 合计收入 其中(比例分配),收入1=Smoney*50% 收入2=SmoneyS*30拜谢了.
DECLARE @AreaName nvarchar(100)
SET @AreaName = N'长沙'-- 得到所有长沙地区及下属地区
DECLARE @t TABLE(id int, Level int)
DECLARE @l int
SET @l = 0
INSERT @t SELECT id, @l FROM Area
WHERE AreaName = @AreaName
WHILE @@ROWCOUNT > 0
BEGIN
SET @l = @l + 1
INSERT @t SELECT A.id, @l
FROM Area A, @t B
WHERE A.parentID = B.id
AND B.Level = @l - 1
END-- 统计
SELECT ISNULL(A.AreaName, B.AreaName) as 地区名,
A.[交款数量(开单)],
A.[金额(开单)],
B.[收入1(总公司)],
B.[收入2(交国家)],
B.[合计收入]
FROM(
SELECT AA.AreaName,
COUNT(*) as [交款数量(开单)],
SUM(S.moneyK) as [金额(开单)]
FROM @t A, dw D, Save1 S, Area AA
WHERE A.id = D.AreaID
AND D.id = S.dwID
AND A.id = AA.id
GROUP BY AA.AreaName
)A
FULL JOIN(
SELECT AA.AreaName,
SUM(S.SmoneyS) *.5 as [收入1(总公司)],
SUM(S.SmoneyS) *.3 as [收入2(交国家)],
SUM(S.SmoneyS) as [合计收入]
FROM @t A, dw D, Save2 S, Area AA
WHERE A.id = D.AreaID
AND D.id = S.dwID
AND A.id = AA.id
GROUP BY AA.AreaName
)B
ON A.AreaName = B.AreaName
-- 定义要查询的地区
DECLARE @AreaName nvarchar(100)
SET @AreaName = N'长沙'-- 得到所有长沙地区及下属地区
;WITH AreaT
AS(
SELECT * FROM Area WHERE AreaName = @AreaName
UNION ALL
SELECT A.* FROM Area A, AreaT B
WHERE A.parentID = B.id
)-- 统计
SELECT ISNULL(A.AreaName, B.AreaName) as 地区名,
A.[交款数量(开单)],
A.[金额(开单)],
B.[收入1(总公司)],
B.[收入2(交国家)],
B.[合计收入]
FROM(
SELECT A.AreaName,
COUNT(*) as [交款数量(开单)],
SUM(S.moneyK) as [金额(开单)]
FROM AreaT A, dw D, Save1 S
WHERE A.id = D.AreaID
AND D.id = S.dwID
GROUP BY A.AreaName
)A
FULL JOIN(
SELECT A.AreaName,
SUM(S.SmoneyS) *.5 as [收入1(总公司)],
SUM(S.SmoneyS) *.3 as [收入2(交国家)],
SUM(S.SmoneyS) as [合计收入]
FROM AreaT A, dw D, Save2 S
WHERE A.id = D.AreaID
AND D.id = S.dwID
GROUP BY A.AreaName
)B
ON A.AreaName = B.AreaName
create function fn_地区id(
@id int)
returns @r tabke (
id int,
AreaName varchar(20),
bm varchar(20)
)
as
begin
insert @r select
id, AreaName, bm
from Area
where id=@id
while exists (
select 1 from Area where id not in (select id from @r)
and parentID in (select id from @r)
)
insert @r
select id, AreaName, bm from Area where id not in (select id from @r)
and parentID in (select id from @r)
return
endgo--查询
select AreaName as 地区名,sum(num) as [交款数量(开单)],sum(moneyK) as [金额(开单)],sum(SmoneyS1) as [收入1(总公司)],sum(SmoneyS2) as [收入2(交国家)],sum(SmoneyS) as [合计收入]
from (
select b.AreaName,1 as num,a.moneyK,0 as SmoneyS1,0 as SmoneyS2,0 as SmoneyS
from Save1 a,dbo.fn_地区id(2) b
where a.dwid=b.id
and a.dateK>='2005-1-1'
and a.dateK<='2006-1-1'
union all
select b.AreaName,0 as num,0 as moneyK,SmoneyS*0.5 as SmoneyS1,SmoneyS*0.3 as SmoneyS2,SmoneyS
from Save2 a,dbo.fn_地区id(2) b
where a.dwid=b.id
and a.dateS>='2005-1-1'
and a.dateS<='2006-1-1'
) as t
group by AreaName地区名 交款数量(开单) 金额(开单) 收入1(总公司) 收入2(交国家) 合计收入
您好,我们是“2006中国杰出数据库工程师评选”活动组委会。
您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。
http://www.bestdba.cn/match_discussion.aspx在那里,进入本次评选终选的30位数据库工程师将与您展开积极的互动。他们会为您的问题提供满意的答案,此外,您还可以在“专家在线答疑”区提出新的问题并参与讨论。您的帖子位于:
http://www.bestdba.cn/match_discussion3.aspx?pointid=446&pointid2=1&pointid3=5&pcount=stc
非常感谢您对本次活动的支持!
--------------------------------------------------------------
级别码为0的控制4位 就是4-0×2
为1的控制两位 就是 4-1×2
……
所以汇总的条件就是:like left(自己的id,6-4+级别码×2)+‘%’