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

Есть два числовых столбца в таблице (количество и это же количество, но собранное по заказам).
все это выглядит примерно так:

с1 | с2
--------------
45 | 44.99675
0.2 | 0.2133
78.55 | 78.55300301
0.007 | 0.006666667

Необходимо решить следующую задачу: в запросе округлять столбец с2 до точности столбца с1.
т.е. необходим следующий результат:

с1 | с2 | результат
--------------------------------------------
45 | 44.99675 | 45
0.2 | 0.2133 | 0.2
78.55 | 78.55300301 | 78.55
0.007 | 0.006666667 | 0.007

фактически получается
 SELECT ROUND([c2], f([c1])) 
, где функция f([c1]) - возвращает число знаков после запятой у [c1].

Быстродействие критично.

Спасибо.
26 апр 12, 20:40    [12476462]     Ответить | Цитировать Сообщить модератору
 Re: количество цифр после запятой и округление  [new]
step_ks
Member

Откуда:
Сообщений: 936
тестовая задачка для собеседования?
26 апр 12, 22:23    [12476814]     Ответить | Цитировать Сообщить модератору
 Re: количество цифр после запятой и округление  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
сопр777, а что не получилось то?
нарисуйте фунцию, где сделайте необходимые вычисления.
можно конечно и без пользовательской функции здесь обойтись...
27 апр 12, 05:57    [12477420]     Ответить | Цитировать Сообщить модератору
 Re: количество цифр после запятой и округление  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
	declare	@t table (
	x decimal(38,16)
	)
	insert	@t
	select	123789.456789 	union all
	select	123.78941	union all
	select	789.4578	union all
	select	456.01		union all
	select	10001000	union all
	select	0.000000000000033

	select	x
	,	x-0.0000000000000001 y
	,	round(x-0.0000000000000001,17-patindex(N'%[.1-9]%'
		,reverse(convert(nvarchar(40),x,2))))z
	,	ltrim(str(round(x-0.0000000000000001,17-patindex(N'%[.1-9]%'
		,reverse(convert(nvarchar(40),x,2)))),40,17-patindex(N'%[.1-9]%'
		,reverse(convert(nvarchar(40),x,2)))))z_str
	from	@t
27 апр 12, 07:04    [12477442]     Ответить | Цитировать Сообщить модератору
 Re: количество цифр после запятой и округление  [new]
Glory
Member

Откуда:
Сообщений: 104751
сопр777
Необходимо решить следующую задачу: в запросе округлять столбец с2 до точности столбца с1.
т.е. необходим следующий результат:

с1 | с2 | результат
--------------------------------------------
45 | 44.99675 | 45
0.2 | 0.2133 | 0.2
78.55 | 78.55300301 | 78.55
0.007 | 0.006666667 | 0.007

select c1, c2, c1 as result from mytable
27 апр 12, 08:04    [12477487]     Ответить | Цитировать Сообщить модератору
 Re: количество цифр после запятой и округление  [new]
rino_spam
Member

Откуда:
Сообщений: 4
Glory
сопр777
Необходимо решить следующую задачу: в запросе округлять столбец с2 до точности столбца с1.
т.е. необходим следующий результат:

с1 | с2 | результат
--------------------------------------------
45 | 44.99675 | 45
0.2 | 0.2133 | 0.2
78.55 | 78.55300301 | 78.55
0.007 | 0.006666667 | 0.007

select c1, c2, c1 as result from mytable


под столом... ну собственно какой вопрос(пример), такой ответ....
27 апр 12, 08:39    [12477547]     Ответить | Цитировать Сообщить модератору
 Re: количество цифр после запятой и округление  [new]
invm
Member

Откуда: Москва
Сообщений: 9830
declare @t table (c1 numeric(18,3), c2 numeric(18,10));

insert into @t
values
 (45, 44.99675),
 (0.2, 0.2133),
 (78.55, 78.55300301),
 (0.007, 0.006666667);

with x as
( 
 select
  c1, c2,
  replace(cast(c1 as varchar(18)), '0', ' ') v
 from
  @t
)
select
 *,
 round(c2, len(v) - charindex('.', v))
from
 x;
27 апр 12, 10:26    [12478046]     Ответить | Цитировать Сообщить модератору
 Re: количество цифр после запятой и округление  [new]
сопр777
Guest
step_ks
тестовая задачка для собеседования?


А это имеет какое-либо значение для решения задачи?

Нет, это не задача с собеседования, а реальная ситуация из рабочего процесса.
Ситуация примерно такая. Есть проект строительства. По проекту необходимо 10 км забора, есть (ТУ на забор). Есть несколько подрядчиков. Они сами закупают матерьялы и строят. Ограничений нет, они могут где-то купить готовый забор, могут купить металл и сами изготовить забор, могут передать строительство забора на своем участке субподрядчику.
В итоге получаем:

Исходные 10 км забора делятся по субподрядчикам:
1й - купил 3 км готового забора;
2й - купил 1500 м готового забора;
3й - купил 600 заборных секций;
4й - купил 3 т металла, из которого сам будет варить забор;
5й - купил 7000 м арматуры, из которого сам будет варить забор;
6й и последующие тоже купили что-то для строительства забора в какой-либо единице измерения.

Существуют коэффициенты перечета из одной единицы измерения в другую (примерно выглядят так 4.576397522378).

Естественно, при попытке сбора итоговой суммы по подрядчикам в единой единице измерения, у сумм появляются хвосты, которые надо округлять.

Для моей задачи надо округлять так, как я написал в стартовом посте.
27 апр 12, 13:35    [12479555]     Ответить | Цитировать Сообщить модератору
 Re: количество цифр после запятой и округление  [new]
офигеть
Guest
сопр777
Они сами закупают матерьялы и строят

чья-чья матерь?
27 апр 12, 13:48    [12479647]     Ответить | Цитировать Сообщить модератору
 Re: количество цифр после запятой и округление  [new]
сопр7777
Guest
Geep
сопр777, а что не получилось то?
нарисуйте фунцию, где сделайте необходимые вычисления.
можно конечно и без пользовательской функции здесь обойтись...


не получилось вот что:

DECLARE @n as float

SET @n = 456.123456789089

SELECT CAST(@n AS VARCHAR), LEN(CAST(@n AS VARCHAR))


Результат:

456.123 и длинна = 7

Явно не то, что надо... (до сих пор не понял почему так)


Большое спасибо Geep и invm. Задача решена с вашей помощью.

В итоге чуть переделал решение invm под свою задачу:

select 
	*, 
	round(c2, len(replace(cast(c1 as varchar(18)), '0', ' ')) - charindex('.', replace(cast(c1 as varchar(18)), '0', ' '))) as result
from
	@t


Спасибо!
27 апр 12, 13:49    [12479650]     Ответить | Цитировать Сообщить модератору
 Re: количество цифр после запятой и округление  [new]
сопр777
Guest
офигеть
сопр777
Они сами закупают матерьялы и строят

чья-чья матерь?


да иха, иха матерь... эх матерь иха.....
27 апр 12, 13:50    [12479659]     Ответить | Цитировать Сообщить модератору
 Re: количество цифр после запятой и округление  [new]
step_ks
Member

Откуда:
Сообщений: 936
сопр777
step_ks
тестовая задачка для собеседования?


А это имеет какое-либо значение для решения задачи?

Для решения - может и нет, а для того, чтобы это решение выкладывать здесь - имеет.
28 апр 12, 09:34    [12483549]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить