1

我有一个像这样的税收数据表

DECLARE @TaxSummary TABLE(
    TaxRegionType           SMALLINT NOT NULL,
    ActualRegionTaxTotal    NUMERIC(10,2) NULL,
    LineRegionTaxTotal      NUMERIC(10,2) NULL,
    ExtendedRegionTaxTotal  Numeric(14,6) NULL
)

而且我有一定数量的美分分配给该表中的每个区域类型......假设我有 5 额外的美分,所以我有

Declare @Cents int = 5

Declare @Delta = 0.01

目前我用这样的while循环更新表格

SET @Count = 0
    WHILE (@Count < @Cents)
      BEGIN
        SET @Count = @Count + 1

            UPDATE @TaxSummary
            SET ActualRegionTaxTotal = ActualRegionTaxTotal + @Delta
            WHERE TaxRegionType =
            (SELECT TOP(1) TaxRegionType
            FROM @TaxSummary
            WHERE ExtendedRegionTaxTotal <> 0
            ORDER BY ExtendedRegionTaxTotal-ActualRegionTaxTotal DESC)

      END

有没有办法使用 CTE 来完成?还是非循环?基本上我想从差异最大的行开始为每一行添加一分,并继续添加到差异最大的行,直到使用所有额外的美分。

4

2 回答 2

0

Ok, here is what I have and it only sets new_tax for each region to 10.01 so it only uses 2 cents and not all 5.....that is why I am confused...am I missing something?

DECLARE
    @OrderTotalTax      NUMERIC(10,2),
    @CollectedTax       NUMERIC(10,2),
    @RegionTotalTax     NUMERIC(10,2)

DECLARE @TaxSummary TABLE
(
    TaxRegionType           SMALLINT NOT NULL,
    ActualRegionTaxTotal    NUMERIC(10,2) NULL,
    LineRegionTaxTotal      NUMERIC(10,2) NULL,
    ExtendedRegionTaxTotal  Numeric(14,6) NULL
)


insert into @TaxSummary (TaxRegionType, ActualRegionTaxTotal, LineRegionTaxTotal,
ExtendedRegionTaxTotal )
values ( 1, 10.00, 0, 10.04 )

insert into @TaxSummary (TaxRegionType, ActualRegionTaxTotal, LineRegionTaxTotal,
ExtendedRegionTaxTotal )
values ( 2, 10.00, 0, 10.01 )

-- RegionTotalTax = 20.00
SELECT @RegionTotalTax = SUM(ActualRegionTaxTotal) from @TaxSummary

Declare @Cents int = 0

set @OrderTotalTax = 20.05


-- Cents will be 20.05-20.00*100 = 5
SET @Cents = ABS((@OrderTotalTax - @RegionTotalTax) * 100)

-- Distribute one cent at a time
Declare @Delta DECIMAL(18,2) = 0.01

select
TaxRegionType,
ActualRegionTaxTotal old_tax,
ActualRegionTaxTotal + case when rn <= @Cents then 0.01 else 0 end new_tax
from
(
select
TaxRegionType, 
ActualRegionTaxTotal,
row_number () over (partition by null order by ExtendedRegionTaxTotal-
ActualRegionTaxTotal desc) rn
from 
@TaxSummary 
) d
于 2012-06-26T15:47:17.147 回答
0

这可能会给您一个总体思路来帮助您入门 - 只需在每一行中添加一分钱,直到内联视图中的行号等于您尝试丢失的额外行号:

declare @cents int = 5

select
region,
tax old_tax,
tax + case when rn <= @cents then 0.01 else 0 end new_tax

from
(
select
region, 
tax,
row_number () over (partition by null order by tax desc) rn

from 
dbo.taxsummary 
) d
于 2012-06-22T19:54:54.317 回答