sql在最后累积小数

时间:2018-05-23 07:27:54

标签: sql tsql

我需要一个简单的查询帮助,将值分成相等的数字。但我也想避免小数值将它们全部累加到最终值。这可以通过下面的查询实现,但是如果我选择不同的数据类型,例如 MONEY NUMERIC @amt ,这很棘手。任何人都可以使用 MONEY NUMERIC 数据类型执行下面的操作吗?

DECLARE @tbl TABLE (id TINYINT, princ NUMERIC (14,2))
DECLARE @counter INT  = 1
DECLARE @term TINYINT = 12
DECLARE @amt INT = 50000
DECLARE @decimals INT = @amt-((@amt/@term)*@term)

WHILE @counter <= @term

    BEGIN 
            INSERT INTO @tbl (id,princ)
            SELECT  @counter, @amt/@term
            SET @counter = @counter + 1
            UPDATE @tbl SET princ = princ+@decimals WHERE id = @term
    END

SELECT * FROM @tbl

1 个答案:

答案 0 :(得分:0)

<Do what you need to do you populate the table, excluding the last row>

INSERT INTO
  @tbl (
    id,
    princ
  )
SELECT
  MAX(id) + 1,
  @amt - SUM(princ)
FROM
  @tbl

或者,或许,CTE ......

WITH
  recursive_distribution AS
(
  SELECT 0 AS id, CAST(@amt / @term AS INT) AS princ

  UNION ALL

  SELECT id + 1, princ
    FROM recursive_distribution
   WHERE id < @term - 1

  UNION ALL

  SELECT 1, @amt - (princ * (@term-1))
    FROM recursive_distribution
   WHERE id = @term - 1
)
INSERT INTO
  @tbl (id, princ)
SELECT
  id, princ
FROM
  recursive_distribution
WHERE
  id > 0
OPTION
  (MAXRECURSION 0)  -- Only needed if @term >= 100

(从0开始,然后排除第0行意味着可以应对@term = 1)