Bucket填充SQL Server

时间:2016-09-06 16:20:04

标签: sql sql-server-2008 common-table-expression

我正在尝试扩展以下查询以允许从表而不是单个值填充存储桶。在下面的示例中,我想将@AmountToAllocate替换为将用于填充存储桶的潜在值表。任何建议都高度赞赏。

create table dbo.Buckets 

( TotalSize     int not null,

  Amount        int not null,

  BucketID      int not null,

constraint pk_Buckets primary key (BucketID),

constraint ck_Buckets_Amount check ( Amount between 0 and TotalSize)

)

go

insert into dbo.Buckets (TotalSize,Amount,BucketID)

select 10, 1, 1

go


insert into dbo.Buckets (TotalSize,Amount,BucketID)

select 5, 2, 2

go


insert into dbo.Buckets (TotalSize,Amount,BucketID)

select 10, 0, 3

go



insert into dbo.Buckets (TotalSize,Amount,BucketID)

select 10, 0, 4

go


DECLARE @AmountToAllocate INT = 12 


;WITH Calculator AS (

SELECT 
    BucketID, TotalSize, Amount,

    AmountLeftToAllocate = CASE 

        WHEN @AmountToAllocate > (TotalSize - Amount) THEN @AmountToAllocate - (TotalSize - Amount)

        WHEN @AmountToAllocate < 0 AND ABS(@AmountToAllocate) > Amount THEN Amount + @AmountToAllocate 

        ELSE 0 END,

    NewAmount = CASE 

        WHEN @AmountToAllocate > (TotalSize - Amount) THEN TotalSize
        WHEN @AmountToAllocate < 0 AND ABS(@AmountToAllocate) > Amount THEN 0       
        ELSE Amount + @AmountToAllocate END  

FROM dbo.Buckets

WHERE BucketID = 1

UNION ALL

SELECT 
    tr.BucketID, tr.TotalSize, tr.Amount,  
    AmountLeftToAllocate = CASE 
        WHEN lr.AmountLeftToAllocate > (tr.TotalSize - tr.Amount) THEN lr.AmountLeftToAllocate - (tr.TotalSize - tr.Amount)
        WHEN lr.AmountLeftToAllocate < 0 AND ABS(lr.AmountLeftToAllocate) > tr.Amount THEN tr.Amount + lr.AmountLeftToAllocate 
        ELSE 0 END,
    NewAmount = CASE 
        WHEN lr.AmountLeftToAllocate > (tr.TotalSize - tr.Amount) THEN tr.TotalSize
        WHEN lr.AmountLeftToAllocate < 0 AND ABS(lr.AmountLeftToAllocate) > tr.Amount THEN 0        
        ELSE tr.Amount + lr.AmountLeftToAllocate END  
FROM dbo.Buckets tr
INNER JOIN Calculator lr ON lr.BucketID + 1 = tr.BucketID 
)

SELECT  
    BucketID, 
    TotalSize,
    Amount = NewAmount, 
    OldAmount = Amount 
FROM Calculator

0 个答案:

没有答案