• 递归用函数、存储过程实现的效果


    --測試

    create table ta ( 项目 varchar ( 20), 上级项目 varchar ( 20), num int )

    insert ta

    select 'A' , '' , 100 union all

    select 'B' , 'A' , 200 union all

    select 'C' , 'B' , 300 union all

    select 'D' , 'B' , 400 union all

    select 'E' , 'C' , 500 union all

    select 'F' , 'D' , 600 union all

    select 'H' , 'E' , 700 union all

    select 'G' , 'F' , 800

     

    -- 如果要显示上级的项目 :

     

     

     

    create function roy_f( @ 项目 varchar ( 20))

    returns varchar ( 100)

    as

    begin

     

    declare @ 上级项目 varchar ( 20)

     

    select @ 上级项目 = 上级项目 from ta where 项目 = @ 项目

     

    return case when @ 上级项目 is null then null

     

                else   isnull ( dbo. roy_f( @ 上级项目 )+ '-' , '' )+ @ 项目 end

    end

     

     

     

     

    -- 如果显示各级项目的汇总金额 :

     

     

    create function roy_f2( @ 项目 varchar ( 20))

    returns int

    as

    begin

        declare @tb table ( 项目 varchar ( 20), 上级项目 varchar ( 20), num int , lev int )

        declare @i int , @sum int

        set @i= 0

        insert @tb select *, @i from ta where 项目 = @ 项目

        while @@rowcount > 0

            begin

                set @i= @i+ 1

                insert @tb

                select a.*, @i

                from ta a, @tb b

                where b. 项目 = a. 上级项目 and b. lev= @i- 1

            end

        select @sum= sum ( num) from @tb

        return @sum

    end

     

    -- 测试 :

     

    select 项目 , 金额 = dbo. roy_f2( 项目 ), 关系 = dbo. roy_f( 项目 ) from ta

     

    /*

    项目                    金额           关系       

    -------------------- ----------- ---------------

    A                    3600        A

    B                    3500        A-B

    C                    1500        A-B-C

    D                    1800        A-B-D

    E                    1200        A-B-C-E

    F                    1400        A-B-D-F

    H                    700         A-B-C-E-H

    G                    800         A-B-D-F-G

     

    (所影响的行数为 8 行)

    */

     

     

    -- 用存储过程统计 :

     

    create proc roy_p @ 项目 varchar ( 20)

    as

    begin

    declare @i int

    set @i= 0

    select *, 级数 = @i into #

    from ta where 项目 = @ 项目

    while @@rowcount > 0

    begin

    set @i= @i+ 1

    insert #

    select ta.*, 级数 = @i

    from ta, # b

    where ta. 上级项目 = b. 项目

    and b. 级数 = @i- 1

    end

    select [sum]= sum ( num) from #

    end

     

    -- 测试 :

     

    exec roy_p 'A'

     

    /*

    sum       

    -----------

    3600

     

    (所影响的行数为 1 行)

    */

     

     

    -- 删除测试 :

     

    drop function roy_f, roy_f2

    drop proc roy_p

    drop table ta

     

     

  • 相关阅读:
    【华为云技术分享】昇腾AI处理器软件栈--总览
    【云速建站】SSL证书自助部署
    【华为云技术分享】如何做一个优秀软件-可扩展的架构,良好的编码,可信的过程
    C# Async和Await的异步编程例子
    委托的简单例子
    批量修改图片的尺寸(c#)
    使用TinyPNG提供的API,对图片进行压缩(C#)
    21. 合并两个排序单链表 Merge Two Sorted Lists
    263. 丑陋数 Ugly Number
    413. 数组切片 Arithmetic Slices
  • 原文地址:https://www.cnblogs.com/Roy_88/p/5463118.html
Copyright © 2020-2023  润新知