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を使用してこれを行う方法はありますか?または非ループ?基本的に、差が最も大きい行から始まる各行に1セントを追加し、余分なセントがすべて使用されるまで、差が最も大きい行に追加し続けます。

4

2 に答える 2

0

わかりました、これが私が持っているもので、各地域のnew_taxを10.01に設定するだけなので、2セントしか使用せず、すべてではありません5 .....それが私が混乱している理由です...何かが足りないのですか?

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

これにより、作業を開始するのに役立つ一般的なアイデアが得られる場合があります。インライン ビューの行番号が、減らそうとしている追加分と等しくなるまで、各行に 1 セント追加するだけです。

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 に答える