sql >> データベース >  >> RDS >> Sqlserver

バケット充填 SQL クエリ CTE

    これは、SQL Server 2008 で次のように行うことができます:

    declare @Buckets table (ID char(2), FullCapacity int)
    declare @Filler table (ID char(2), Filler int)
    
    insert into @Buckets 
    select 'B1', 100 union all
    select 'B2', 50 union all
    select 'B3', 70 
    
    insert into @Filler 
    select 'F1', 90 union all
    select 'F2', 70 union all
    select 'F3', 40 union all
    select 'F4', 20
    
    
    select 
        b.ID, 
        b.FullCapacity,
        case 
            when f.TotalFill < b.RunningTotalCapacity then 0
            when f.TotalFill > b.RunningTotalCapacity + b.FullCapacity then b.FullCapacity
            else f.TotalFill - b.RunningTotalCapacity
        end as CurrentAmount
    from
    (
        select      
        ID,
        Filler,
        (
            select sum(f2.Filler)
            from @Filler as f2
            where f2.ID <= f.ID
        ) as TotalFill
        from @Filler as f
    ) as f
    cross join 
    (
        select 
            ID,
            FullCapacity, 
            (
                select isnull(sum(b2.FullCapacity), 0)
                from @Buckets as b2
                where b2.ID < b.ID
            ) as RunningTotalCapacity
        from @Buckets as b
    ) as b
    order by f.ID, b.ID
    

    これは、次のようなウィンドウ関数を使用して行うことができます:

    SQL Server 2012+

        declare @Buckets table (ID char(2), FullCapacity int)
        declare @Filler table (ID char(2), Filler int)
    
        insert into @Buckets values
        ('B1', 100),
        ('B2', 50),
        ('B3', 70)
    
        insert into @Filler values
        ('F1', 90),
        ('F2', 70),
        ('F3', 40),
        ('F4', 20)
    
        ;with fillerCte as
        (
            select      
                ID,
                Filler,
                sum(Filler) over (order by ID) as TotalFill
            from @Filler
        ), 
        BucketCte as
        (
            select 
                ID,
                FullCapacity,
                sum(FullCapacity) over (order by ID) - FullCapacity as RunningTotalCapacity
            from @Buckets
        )
        select 
            b.ID, 
            b.FullCapacity,
            case 
                when f.TotalFill < b.RunningTotalCapacity then 0
                when f.TotalFill > b.RunningTotalCapacity + b.FullCapacity then b.FullCapacity
                else f.TotalFill - b.RunningTotalCapacity
            end as CurrentAmount
        from fillerCte as f
        cross join BucketCte as b
        order by f.ID, b.ID
    


    1. RowMapperを実装するクラスでのSpringマネージドBeanインジェクション

    2. SQL-Oracleで最大値の列を持つ行を選択する方法

    3. 複合ステートメントでEVENTを作成したときに、このエラーが発生したのはなぜですか?

    4. 電子メールを受信したときにスクリプトを実行する最も簡単な方法は何ですか?