Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разбивка записей на части. / 13 сообщений из 13, страница 1 из 1
09.07.2019, 13:11
    #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
09.07.2019, 13:29
    #39835450
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка записей на части.
Шо, деление 11.34 / 5 не справляется?
...
Рейтинг: 0 / 0
09.07.2019, 13:43
    #39835460
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка записей на части.
nick348,
разбивать, делить, думать про точность
...
Рейтинг: 0 / 0
09.07.2019, 14:23
    #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
09.07.2019, 14:36
    #39835487
nick348
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка записей на части.
iiyama,

Чему соответствует?
Если бы было не надо, то не было бы и вопроса.
...
Рейтинг: 0 / 0
09.07.2019, 14:36
    #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
09.07.2019, 14:41
    #39835491
nick348
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка записей на части.
aleks222,

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

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

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

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

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

Можно узнать, откуда такие задачи берутся?
...
Рейтинг: 0 / 0
10.07.2019, 09:15
    #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
10.07.2019, 09:18
    #39835796
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбивка записей на части.
Блин, только хотел нарисоваться со своим решением, как выяснилось, что invm мало того, что всё решил, но еще и практически точно также, но при этом изящнее!

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

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


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