sql накапливать десятичные дроби в конце - PullRequest
0 голосов
/ 23 мая 2018

Мне нужна помощь с простым запросом для деления значения на равные числа.Но я также хочу избегать десятичных значений, чтобы все их накапливалось до конечного значения. Это достижимо по запросу ниже, однако, если я выберу другой тип данных, такой как MONEY или NUMERIC для @ amt , это сложно.Кто-нибудь может сделать то, что я сделал ниже, с ДЕНЬГАМИ или ЧИСЛОВЫМИ типом данных?

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 голосов
/ 23 мая 2018
<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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...