Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Разбивка записей на части.  [new]
nick348
Member

Откуда: Санкт-Петербург
Сообщений: 99
Если таблица t1 (sum decimal(5,2); desc varchar(255))
с записями вида
11.34 desc1
112.34 desc2
3433.34 desc3

Необходимо из каждой записи сделать несколько, т.е что бы сумма 11.34 например делилась между пятью записями, 11.34 между четырьмя и т.д. Сумма новых должна быть равна одной старой, количество новых случайно.

Какие есть варианты решения данной задачи?
9 июл 19, 13:11    [21923384]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка записей на части.  [new]
aleks222
Member

Откуда:
Сообщений: 754
Шо, деление 11.34 / 5 не справляется?
9 июл 19, 13:29    [21923411]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка записей на части.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6680
nick348,
разбивать, делить, думать про точность
9 июл 19, 13:43    [21923430]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка записей на части.  [new]
iiyama
Member

Откуда:
Сообщений: 615
nick348,
+

declare @t table([sum] decimal(6,2), [desc] varchar(255))
declare @N table(n int) insert into @N values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)

insert into @t values(11.34,'desc1'),(112.34,'desc2'),(3433.33,'desc3')

;with NT AS
(
select *, ABS(CHECKSUM(NEWID())) % 10 AS n
from @t
)
select 
	Nt.[desc], CASE WHEN N.n=0 THEN Nt.[sum] ELSE 0 END AS [SUMi], NT.n+1 AS [parts]
from NT
	left join @N N ON Nt.n>=N.n
order by 1	



PS. Соответствует ТЗ и про точность думать не надо
9 июл 19, 14:23    [21923462]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка записей на части.  [new]
nick348
Member

Откуда: Санкт-Петербург
Сообщений: 99
iiyama,

Чему соответствует?
Если бы было не надо, то не было бы и вопроса.
9 июл 19, 14:36    [21923467]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка записей на части.  [new]
invm
Member

Откуда: Москва
Сообщений: 8838
declare @t1 table (sum decimal(6,2), [desc] varchar(255));

insert into @t1
values
(11.34, 'desc1'),
(112.34, 'desc2'),
(3433.34, 'desc3');

with d10 as
(
 select v from (values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)) t(v)
),
n as
(
 select
  row_number() over (order by (select 1)) as n
 from
  d10 a cross join d10 b cross join d10 c cross join d10 d cross join d10 e
)
select
 a.*, c.n,
 d.piece + sign(sign(c.n - b.cnt) + 1) * (sum - d.piece * c.n)
from
 @t1 a cross apply
 (select cast(rand(checksum(newid(), a.sum)) * 10 + 1 as int)) b(cnt) cross apply
 (select top (b.cnt) n from n) c cross apply
 (select cast(sum / b.cnt as numeric(6,2))) d(piece);
9 июл 19, 14:36    [21923470]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка записей на части.  [new]
nick348
Member

Откуда: Санкт-Петербург
Сообщений: 99
aleks222,

В рамках пример справляется, а подели например 12.37 на 3 , получится 4.12(3). Теперь 4.12(3) умножь на три.
Согласен пример привел простой.
9 июл 19, 14:41    [21923474]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка записей на части.  [new]
Shakill
Member

Откуда: мск
Сообщений: 1838
nick348
aleks222,

В рамках пример справляется, а подели например 12.37 на 3 , получится 4.12(3). Теперь 4.12(3) умножь на три.
Согласен пример привел простой.


для подбивки суммы к последнему вычисленному слагаемому добавляйте дельту, делов-то
9 июл 19, 14:42    [21923477]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка записей на части.  [new]
iiyama
Member

Откуда:
Сообщений: 615
nick348,

вы точно запускали скипт invm?

К сообщению приложен файл. Размер - 6Kb
9 июл 19, 14:53    [21923486]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка записей на части.  [new]
nick348
Member

Откуда: Санкт-Петербург
Сообщений: 99
iiyama,

спасибо.
9 июл 19, 15:03    [21923495]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка записей на части.  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 303
nick348,

Можно узнать, откуда такие задачи берутся?
10 июл 19, 00:39    [21923872]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка записей на части.  [new]
uaggster
Member

Откуда:
Сообщений: 724
if OBJECT_ID('tempdb..#t') is not null 
	drop table #t
Go

Create table #t([sum] decimal(8,2), [desc] varchar(255))

insert into #t([sum], [desc])
Values
 (11.34,  'desc1')
,(112.34, 'desc2')
,(3433.34, 'desc3')

Select 
Case when t.x <> t.N or t.x = 1.0  then [d_sum]
	Else [sum] - [d_sum] * (t.x - 1.0)
End [sum]
, [desc]
From (
Select t0.*
, t3.x
, Cast(t0.[sum] / t3.x as decimal(8,2)) [d_sum]
, ROW_NUMBER() over (partition by t0.[sum], t0.[desc], t3.x order by 1/0) N
from 
#t t0
Cross apply (Values(ABS(CHECKSUM(NewId())) % 9 + 1)) t1(x)
Cross apply (
			Select top (Select t1.x) Cast(x as decimal(8,2)) x
				From (Values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) t2(n) 
			) t3
) t
10 июл 19, 09:15    [21923942]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка записей на части.  [new]
uaggster
Member

Откуда:
Сообщений: 724
Блин, только хотел нарисоваться со своим решением, как выяснилось, что invm мало того, что всё решил, но еще и практически точно также, но при этом изящнее!

... жизнь - боль :-))))))

Тема с заготовкой ответа с вечера на работе висела открытой, не сделал рефреш. :-)
10 июл 19, 09:18    [21923947]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить