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拜谢了.

解决方案 »

  1.   

    -- 定义要查询的地区
    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
      

  2.   

    -- 2005 可以用
    -- 定义要查询的地区
    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
      

  3.   

    --1、建立函数
    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(交国家) 合计收入
      

  4.   

    --------------------------------------------------------------
    您好,我们是“2006中国杰出数据库工程师评选”活动组委会。
    您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。
    http://www.bestdba.cn/match_discussion.aspx在那里,进入本次评选终选的30位数据库工程师将与您展开积极的互动。他们会为您的问题提供满意的答案,此外,您还可以在“专家在线答疑”区提出新的问题并参与讨论。您的帖子位于:
    http://www.bestdba.cn/match_discussion3.aspx?pointid=446&pointid2=1&pointid3=5&pcount=stc
    非常感谢您对本次活动的支持!
    --------------------------------------------------------------
      

  5.   

    我觉得很简单啊,不明白难在哪里?
    级别码为0的控制4位 就是4-0×2
    为1的控制两位  就是 4-1×2
    ……
    所以汇总的条件就是:like left(自己的id,6-4+级别码×2)+‘%’