powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разбивка записей на части.
13 сообщений из 13, страница 1 из 1
Разбивка записей на части.
    #39835432
nick348
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если таблица t1 (sum decimal(5,2); desc varchar(255))
с записями вида
11.34 desc1
112.34 desc2
3433.34 desc3

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

Какие есть варианты решения данной задачи?
...
Рейтинг: 0 / 0
Разбивка записей на части.
    #39835450
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шо, деление 11.34 / 5 не справляется?
...
Рейтинг: 0 / 0
Разбивка записей на части.
    #39835460
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nick348,
разбивать, делить, думать про точность
...
Рейтинг: 0 / 0
Разбивка записей на части.
    #39835483
iiyama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nick348,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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. Соответствует ТЗ и про точность думать не надо
...
Рейтинг: 0 / 0
Разбивка записей на части.
    #39835487
nick348
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iiyama,

Чему соответствует?
Если бы было не надо, то не было бы и вопроса.
...
Рейтинг: 0 / 0
Разбивка записей на части.
    #39835489
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
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);
...
Рейтинг: 0 / 0
Разбивка записей на части.
    #39835491
nick348
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

В рамках пример справляется, а подели например 12.37 на 3 , получится 4.12(3). Теперь 4.12(3) умножь на три.
Согласен пример привел простой.
...
Рейтинг: 0 / 0
Разбивка записей на части.
    #39835494
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nick348aleks222,

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

для подбивки суммы к последнему вычисленному слагаемому добавляйте дельту, делов-то
...
Рейтинг: 0 / 0
Разбивка записей на части.
    #39835498
iiyama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nick348,

вы точно запускали скипт invm?
...
Рейтинг: 0 / 0
Разбивка записей на части.
    #39835501
nick348
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iiyama,

спасибо.
...
Рейтинг: 0 / 0
Разбивка записей на части.
    #39835748
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nick348,

Можно узнать, откуда такие задачи берутся?
...
Рейтинг: 0 / 0
Разбивка записей на части.
    #39835791
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
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
...
Рейтинг: 0 / 0
Разбивка записей на части.
    #39835796
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин, только хотел нарисоваться со своим решением, как выяснилось, что invm мало того, что всё решил, но еще и практически точно также, но при этом изящнее!

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

Тема с заготовкой ответа с вечера на работе висела открытой, не сделал рефреш. :-)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разбивка записей на части.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]