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

Откуда:
Сообщений: 6
Существует ли функция для нахождения сумма цифр числа?
Например Сумма цифр числа 111 равна 3
Если нет, то как можно организовать?
MSSQL 2005
20 апр 09, 19:47    [7089013]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
Supra93
Member

Откуда:
Сообщений: 8174
sql-ex?
20 апр 09, 19:49    [7089019]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
nekto_sp
Member

Откуда: Kiev
Сообщений: 63
declare @n bigint = 9223372036854775807

select @n, sum(convert(tinyint,substring(convert(varchar(19) , @n) , v.number, 1)))
	from master..spt_values  v
	where v.type = 'p'
	and v.number between 1 and len(@n)
20 апр 09, 20:05    [7089056]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
vino
Member

Откуда:
Сообщений: 1191
nekto_sp, есть вариант без преобразования в строку, и опять же не ниже 2005
declare @n bigint, @s bigint
select @s = 0, @n = 9223372036854775807
print @n
SELECT @s = @s + (@n - 10*CAST(@n/10 AS bigint)), @n = @n/10 FROM master..spt_values WHERE @n > 0
print @s
здесь можно вместо master..spt_values использовать любую таблицу, в которой количество строк не менее чем возможное количество цифр
21 апр 09, 02:16    [7089603]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
indrikis
Member

Откуда:
Сообщений: 4
select model,
cast(substring(model,1,1) as int) + substring(model,2,1)+
substring(model,3,1)+substring(model,4,1)
from product

странный ответ получил:Неверно.
Ваш запрос вернул правильные данные на основной базе, но не прошел тест на проверочной базе.
* Неверное число записей (меньше на 11)
19 май 09, 14:19    [7198344]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
Сид
Member

Откуда: Москва
Сообщений: 305
Банально и просто вот так:
declare @v bigint, @t int, @r int, @s varchar(100)
select @v=12345678987654321, @t=1, @r=0, @s=convert(varchar(100),@v)
while @t<=len(@s)
begin
set @r=@r+substring(@s,@t,1)
set @t=@t+1
end

select @r
только ногами не бейте...
19 май 09, 14:30    [7198469]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Мои пять копеек
DECLARE @X BIGINT;
SET @X=9223372036854775807;

SELECT SUM(@X/POWER(10,number/2)/POWER(10,number-number/2)%10)
FROM master.dbo.spt_values
WHERE type='P' AND number<LEN(CAST(@X AS VARCHAR));

/*проверка*/
SELECT 9+2+2+3+3+7+2+0+3+6+8+5+4+7+7+5+8+0+7;
Если бы POWER работал с BIGINT, можно было бы так:
SELECT SUM(@X/POWER(10,number)%10)
FROM master.dbo.spt_values
WHERE type='P' AND number<LEN(CAST(@X AS VARCHAR));
19 май 09, 15:11    [7198796]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
Lamer@fools.ua
Member

Откуда: Mississauga, Ontario, Canada
Сообщений: 544
Моя лепта :-)

declare @var bigint = 9223372036854775807;
declare @temp bigint = @var;
declare @sum bigint = 0;

while @temp <> 0
begin
  set @sum = @sum + (@temp % 10);
  set @temp = @temp / 10;
end;

select @sum [Digit Sum];
19 май 09, 17:30    [7199941]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
set nocount on;
declare @var bigint;
select @var = 99999999999911;
with Q(n, m) as
(
  select 1, null
  union all
  select n+1, cast(substring(cast(@var as varchar), n, 1) as int) from Q where n < 30
)
select sum(m)
from Q;
19 май 09, 17:49    [7200100]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
iap
Если бы POWER работал с BIGINT, ...
Неточно выразился.
Я хотел сказать, что аргумент POWER надо приводить к BIGINT явно.
19 май 09, 17:51    [7200110]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
А как посчитать сумму "до конца":
Пример: 789546213

Сумма: 7+8+9+5+4+6+2+1+3 = 45; 4+5=9

T.e. ответ: 9
? :)
20 май 09, 07:36    [7201533]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
vino
Member

Откуда:
Сообщений: 1191
Кудряшка,
declare @n bigint, @s bigint
set @n = 9223372036854775807
print @n
while 1=1 begin
	select @s = 0
	SELECT @s = @s + (@n - 10*CAST(@n/10 AS bigint)), @n = @n/10 FROM master..spt_values WHERE @n > 0
	IF @s < 10 BREAK
	set @n = @s
END
print @s
20 май 09, 12:24    [7203002]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
vino
Member

Откуда:
Сообщений: 1191
точнее и проще так
declare @n bigint, @s bigint, @i bigint
set @n = 789546213--9223372036854775807
print @n
while 1=1 begin
	set @s = 0
	SELECT @s = @s + (@n % 10), @n = @n/10 FROM master..spt_values WHERE @n > 0
	IF @s < 10 BREAK
	set @n = @s
END
print @s
[/quot]
20 май 09, 12:31    [7203042]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
Кудряшка
Member

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

Работает:)
Кста, прикольно то, что если просто убрать из числа все 9-ки (и 0 конечно) либо группу чисел образующих в сумме 9, то вот это финальное число будет точно таким же ;)

Например:
9223372036854775807 =

эти цифры убираем: 9727236725400
эти остаются: 338587

3+3+8+5+8+7 = 34; 3+4=7
20 май 09, 15:46    [7204649]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
vino
Member

Откуда:
Сообщений: 1191
Кудряшка, так это же из свойств девяток: 9+9=1+8=9, и 0 в суммах ничего не значит
А вообще, вроде, суммой Пифагора называют такое хеширование чисел
20 май 09, 17:18    [7205431]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
Кудряшка
Member

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

На самом деле можно еще и другие числа отбрасывать :)
У меня воспоминания детства прорезались. Я номера машин и домов суммировала постоянно, циферки туда-сюда - вот вспомнилось чета
20 май 09, 17:24    [7205479]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
vino
А вообще, вроде, суммой Пифагора называют такое хеширование чисел
Цифровой корень, вообще-то.
20 май 09, 17:30    [7205510]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
NataCat
Guest
indrikis
select model,
cast(substring(model,1,1) as int) + substring(model,2,1)+
substring(model,3,1)+substring(model,4,1)
from product

странный ответ получил:Неверно.
Ваш запрос вернул правильные данные на основной базе, но не прошел тест на проверочной базе.
* Неверное число записей (меньше на 11)



Количество символов в поле model может быть отлично от 4-х. Поэтому и выдает ошибку
27 май 09, 17:12    [7236167]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
BeProf
Member

Откуда: Планета ЗЕМЛЯ
Сообщений: 301
на sql-ex ответ должен начинатся с select так что присутствующие решения не подойдут
11 июн 09, 10:46    [7288881]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
vino
Member

Откуда:
Сообщений: 1191
Да ладно, первое же решение от nekto_sp подойдет, хотя придется повторять номер
select '9223372036854775807', sum(convert(tinyint,substring(convert(varchar(19), '9223372036854775807') , v.number, 1)))
	from master..spt_values  v
	where v.type = 'p'
	and v.number between 1 and len('9223372036854775807')
да и iap предложил еще
11 июн 09, 11:32    [7289159]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
alx111
Member

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

там нельзя пользоваться системными таблицами.
11 июн 09, 11:34    [7289171]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
vino
Member

Откуда:
Сообщений: 1191
alx111, ну так ничего страшного, можно сгенерить последовательность
;with O(n) as (
	SELECT 100
	UNION ALL SELECT n-1 FROM O WHERE n > 0
) select '9223372036854775807', sum(convert(tinyint,substring(convert(varchar(19), '9223372036854775807') , n, 1)))
	from O
11 июн 09, 12:14    [7289485]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
vino
Member

Откуда:
Сообщений: 1191
alx111, можно, конечно и втупую сделать на те же 100 цифр
select '9223372036854775807', sum(convert(tinyint,substring(convert(varchar(19), '9223372036854775807') , n, 1)))
	from (select distinct x.n+y.n*10 as n from
	( select 1 as n
	union all select 2
	union all select 3
	union all select 4
	union all select 5
	union all select 6
	union all select 7
	union all select 8
	union all select 9
	union all select 10
) x cross join 
	( select 0 as n
	union all select 1
	union all select 2
	union all select 3
	union all select 4
	union all select 5
	union all select 6
	union all select 7
	union all select 8
	union all select 9
) y
) numbers
11 июн 09, 12:30    [7289624]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
efdm
Member

Откуда: Москва
Сообщений: 310
DECLARE @X BIGINT;
SET @X=9223372036854775807;

select 
	1*(len(@X) - len(replace(@X,'1',''))) +
	2*(len(@X) - len(replace(@X,'2',''))) +
	3*(len(@X) - len(replace(@X,'3',''))) +
	4*(len(@X) - len(replace(@X,'4',''))) +
	5*(len(@X) - len(replace(@X,'5',''))) +
	6*(len(@X) - len(replace(@X,'6',''))) +
	7*(len(@X) - len(replace(@X,'7',''))) +
	8*(len(@X) - len(replace(@X,'8',''))) +
	9*(len(@X) - len(replace(@X,'9','')))

можно еще явно прописать преобразование к варчару.
Навеяно этим.
11 июн 09, 12:52    [7289796]     Ответить | Цитировать Сообщить модератору
 Re: Сумма цифр числа  [new]
Павел и Ко
Member

Откуда:
Сообщений: 7
Странно, но вот этот запрос, возвращая корректные данные (без проверки) - почему то с ошибкой у меня идет в примере (хотя на реальной БД отрабатывает нормально):

select Pr.model,
sum(convert(tinyint,substring(convert(varchar(50) , Pr.model), v.num, 1))) as sum_d
from product Pr
INNER JOIN (
SELECT ROW_NUMBER() OVER(ORDER BY Pr1.model) AS num FROM product Pr1 CROSS JOIN product Pr2 ) v
ON v.num between 1 and len(Pr.model)
GROUP BY Pr.model

---------------
http://perlmonks.org.ru
15 июн 09, 17:21    [7301526]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить