Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
nick348 Member Откуда: Санкт-Петербург Сообщений: 114 |
Если таблица 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] Ответить | Цитировать Сообщить модератору |
aleks222 Member [заблокирован] Откуда: Сообщений: 1240 |
Шо, деление 11.34 / 5 не справляется? |
9 июл 19, 13:29 [21923411] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
nick348, разбивать, делить, думать про точность |
9 июл 19, 13:43 [21923430] Ответить | Цитировать Сообщить модератору |
iiyama Member Откуда: Сообщений: 642 |
nick348,
PS. Соответствует ТЗ и про точность думать не надо |
|
9 июл 19, 14:23 [21923462] Ответить | Цитировать Сообщить модератору |
nick348 Member Откуда: Санкт-Петербург Сообщений: 114 |
iiyama, Чему соответствует? Если бы было не надо, то не было бы и вопроса. |
9 июл 19, 14:36 [21923467] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9644 |
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] Ответить | Цитировать Сообщить модератору |
nick348 Member Откуда: Санкт-Петербург Сообщений: 114 |
aleks222, В рамках пример справляется, а подели например 12.37 на 3 , получится 4.12(3). Теперь 4.12(3) умножь на три. Согласен пример привел простой. |
9 июл 19, 14:41 [21923474] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
для подбивки суммы к последнему вычисленному слагаемому добавляйте дельту, делов-то |
||
9 июл 19, 14:42 [21923477] Ответить | Цитировать Сообщить модератору |
iiyama Member Откуда: Сообщений: 642 |
nick348, вы точно запускали скипт invm? К сообщению приложен файл. Размер - 6Kb |
9 июл 19, 14:53 [21923486] Ответить | Цитировать Сообщить модератору |
nick348 Member Откуда: Санкт-Петербург Сообщений: 114 |
iiyama, спасибо. |
9 июл 19, 15:03 [21923495] Ответить | Цитировать Сообщить модератору |
Glebanski Member Откуда: Msk ->NL Сообщений: 319 |
nick348, Можно узнать, откуда такие задачи берутся? |
10 июл 19, 00:39 [21923872] Ответить | Цитировать Сообщить модератору |
uaggster Member Откуда: Сообщений: 960 |
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] Ответить | Цитировать Сообщить модератору |
uaggster Member Откуда: Сообщений: 960 |
Блин, только хотел нарисоваться со своим решением, как выяснилось, что invm мало того, что всё решил, но еще и практически точно также, но при этом изящнее! ... жизнь - боль :-)))))) Тема с заготовкой ответа с вечера на работе висела открытой, не сделал рефреш. :-) |
10 июл 19, 09:18 [21923947] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |