從本質上講,使用 SQL Server,我想從下面的當前表中獲取“總金額”(從INSERT或 上的計算列派生UPDATE),然后讓“總金額”通過“分層表”來匯出“ Total A $" 在所需的輸出表中。
我認為這可能需要使用觸發器(也許是函式?)來完成,因為此計算會發生在INSERT或UPDATE因為條件邏輯可以合并到其中,因為存在具有不同最小/最大值和百分比閾值的不同層表對于不同的層次。
下面的例子當然是累計的,和邊際所得稅率一樣的功能,前10000是90%(對于Total A),第二層計算19999是60%,第三層69999是40%,依此類推等等。還有其他具有不同層級的區域,它們只是簡單的查找參考值。
分層表:
| 地區ID | 層號 | 最小 | 最大限度 | 總計 A | 總B |
|---|---|---|---|---|---|
| 3 | 1 | 0 | 10000 | .90 | .10 |
| 3 | 2 | 10001 | 30000 | .60 | .40 |
| 3 | 3 | 30001 | 100000 | .40 | .60 |
| 3 | 4 | 100001 | 500000 | .40 | .60 |
| 3 | 5 | 500001 | 999999999999 | .20 | .80 |
當前表示例:
| 傳輸ID | 地區ID | 總金額 | 總計 % | 總澳元 | 凈額 |
|---|---|---|---|---|---|
| 100001 | 3 | 125000 |
期望的輸出:
| 傳輸ID | 地區ID | 總金額 | 總計 % | 總澳元 | 凈額 |
|---|---|---|---|---|---|
| 100001 | 3 | 125000 | 0.47 | 59000 | 66000 |
任何想法或指導都會非常有幫助和贊賞。
uj5u.com熱心網友回復:
首先,您的層級不太正確。例如,第一個從 開始并在0結束10000,但下一個從 開始10001,留下任何介于 之間10000和10001下落不明的東西。相反,讓您的層彼此相鄰,并使用> AND <=.
其次,這根本不需要觸發器。您應該在需要時即時計算它。如果需要,創建視圖或行內表值函式。
它看起來像一個相當簡單的分組連接,您可以使用CROSS APPLY. 您只需要計算每層要乘多少:GrossAmtor 中的較低者Max,減去Min
SELECT
c.*,
[Total A %] = t.Total / c.GrossAmt,
[Total A $] = t.Total,
[Net Amt] = c.GrossAmt - t.Total
FROM CurrentData c
CROSS APPLY (
SELECT
Total = SUM((v.ActualMax - t.Min) * t.[Total A])
FROM Tiers t
CROSS APPLY (VALUES(
CASE WHEN c.GrossAmt < t.Max THEN c.GrossAmt ELSE t.Max END
)) v(ActualMax)
WHERE c.GrossAmt > t.Min
) t;
資料庫<>小提琴
如果需要,您可以將其作為行內表值函式執行。
CREATE FUNCTION dbo.GetTieredTotal (@GrossAmt decimal(18,9))
RETURNS TABLE
AS RETURN
SELECT
Total = SUM((CASE WHEN @GrossAmt < t.Max THEN @GrossAmt ELSE t.Max END - t.Min) * t.[Total A])
FROM Tiers t
WHERE @GrossAmt > t.Min
;
然后,您可以將主查詢更改為
SELECT
c.*,
[Total A %] = t.Total / c.GrossAmt,
[Total A $] = t.Total,
[Net Amt] = c.GrossAmt - t.Total
FROM CurrentData c
CROSS APPLY dbo.GetTieredTotal (c.GrossAmt) t;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/397840.html
標籤:sql sql-server 查询语句 触发器 计算列
上一篇:程式重復執行
下一篇:黃瓜jvm報告沒有生成
