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

Откуда: Русь
Сообщений: 10
Подскажите, как можно перемножить две цифры из одного числа?

Делаю запрос:

select cast(left (column, 1) as numeric(6,0)) as first,
cast(right (column, 1) as numeric(6,0)) as second
from table t
where t.column like '[02468]%%[13579]'

Как в этом же запросе вывести произведение first*second?
29 дек 09, 14:59    [8132960]     Ответить | Цитировать Сообщить модератору
 Re: Как перемножить две цифры одного числа?  [new]
O_val
Member

Откуда:
Сообщений: 157
cast(left (column, 1) as numeric(6,0)) * cast(right (column, 1) as numeric(6,0)) as first*second
29 дек 09, 15:09    [8133067]     Ответить | Цитировать Сообщить модератору
 Re: Как перемножить две цифры одного числа?  [new]
Gunther_Stolz
Member

Откуда: Русь
Сообщений: 10
O_val,
данный вариант не проходит ругается на '*'.
Возможно я что-то забыл (скобки или что-то еще)?
29 дек 09, 15:19    [8133177]     Ответить | Цитировать Сообщить модератору
 Re: Как перемножить две цифры одного числа?  [new]
sdaasd
Guest
cast(left (column, 1) as numeric(6,0)) * cast(right (column, 1) as numeric(6,0)) as first_mult_second
29 дек 09, 15:25    [8133233]     Ответить | Цитировать Сообщить модератору
 Re: Как перемножить две цифры одного числа?  [new]
Virus квартирус
Member

Откуда: Москва
Сообщений: 41
cast(left (column, 1) as numeric(6,0)) * cast(right (column, 1) as numeric(6,0)) as [first*second]
29 дек 09, 15:29    [8133274]     Ответить | Цитировать Сообщить модератору
 Re: Как перемножить две цифры одного числа?  [new]
Gunther_Stolz
Member

Откуда: Русь
Сообщений: 10
Благодарю.
29 дек 09, 15:31    [8133291]     Ответить | Цитировать Сообщить модератору
 Re: Как перемножить две цифры одного числа?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
DECLARE @X INT=345278;
SELECT (@X%10)*FLOOR(@X/POWER(10, FLOOR(LOG10(@X))));
29 дек 09, 15:46    [8133437]     Ответить | Цитировать Сообщить модератору
 Re: Как перемножить две цифры одного числа?  [new]
Guest1
Member

Откуда: Кристиан Гислер - ТЫ ЛУЧШИЙ !!! :)))
Сообщений: 1342
А как в одном единственном запросе перемножить не 2 цифры, а все цифры, причём количество цифр может быть любым ?
поле column(varchar, 100 ) .
Спасибо
30 дек 09, 18:49    [8139048]     Ответить | Цитировать Сообщить модератору
 Re: Как перемножить две цифры одного числа?  [new]
aleks2
Guest
select   cast(SUBSTRING(X,1,1) as bigint)
	*cast(SUBSTRING(X,2,1) as int)
	*cast(SUBSTRING(X,3,1) as int)
	*cast(SUBSTRING(X,4,1) as int)
	*cast(SUBSTRING(X,5,1) as int)
...
	*cast(SUBSTRING(X,100,1) as int)

FROM
(select RIGHT(REPLICATE('1',100)+[поле],100) as X FROM aTable) Z
30 дек 09, 19:02    [8139086]     Ответить | Цитировать Сообщить модератору
 Re: Как перемножить две цифры одного числа?  [new]
Guest1
Member

Откуда: Кристиан Гислер - ТЫ ЛУЧШИЙ !!! :)))
Сообщений: 1342
спасибо, я тоже так предполагала, но не знала как поступить с размерностью поля ...
а нельзя ли каким-нибудь образом запрограммировать и размерность
поля column(varchar, 100 ) ?
то есть написать запрос для любой ширины поля?
ведь не будешь 100 раз писать cast(SUBSTRING ...
а если поле будет column(varchar, 300 ) ,- что же тогда 300 раз писать?
спасибо
30 дек 09, 22:31    [8139544]     Ответить | Цитировать Сообщить модератору
 Re: Как перемножить две цифры одного числа?  [new]
Ennor Tiegael
Member

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

"А в чем вы собираетесь его хранить?"

Очень грубо, в первом приближении допустим, что ваше 100-значное число в среднем состоит из четверок (да, это очень грубо, но здесь не принципиально). 4^100 = 2^200, соответственно для хранения результата вам потребуется целочисленный тип размером 25 байт. Такого тут даже близко нет.

Вариантов я вижу два: либо вы используете float и попадаете на потерю точности в младших разрядах, либо реализуете собственную арифметику больших чисел.
30 дек 09, 23:38    [8139651]     Ответить | Цитировать Сообщить модератору
 Re: Как перемножить две цифры одного числа?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2974
вот для размерности не более varchar(128)

declare @x varchar(100)

set @x = '12345678'

select
  exp(sum(log(cast(substring(@x, t.i, 1) as tinyint))))
from (
  select
    r0.a*1 + r1.a*2 + r2.a*4 + r3.a*8 + r4.a*16 + r5.a*32 + r6.a*64 i
  from
    (select 0 as a union select 1) r0,
    (select 0 as a union select 1) r1,
    (select 0 as a union select 1) r2,
    (select 0 as a union select 1) r3,
    (select 0 as a union select 1) r4,
    (select 0 as a union select 1) r5,
    (select 0 as a union select 1) r6
) t
where
  t.i > 0 and
  t.i <= len(@x)


токо надо приветс обратно к int


I Have Nine Lives You Have One Only
THINK!
31 дек 09, 08:58    [8139997]     Ответить | Цитировать Сообщить модератору
 Re: Как перемножить две цифры одного числа?  [new]
Guest1
Member

Откуда: Кристиан Гислер - ТЫ ЛУЧШИЙ !!! :)))
Сообщений: 1342
спасибо за ваши знания
да, действительно можно, что-то из высших материй "0 1" и log ... сильно написано, но много шагов, связанных с тем, что это "произведение"
согласна, числа могут получиться большие, но в данном случае мне интересен синтаксис ...,
А можно упростить задачу ? - пусть это будет не произведение, а сумма чисел.
мне надо разобраться, как это работает
Спасибо, прошу прощения за беспокойство )
31 дек 09, 09:31    [8140040]     Ответить | Цитировать Сообщить модератору
 Re: Как перемножить две цифры одного числа?  [new]
vino
Member

Откуда:
Сообщений: 1191
Guest1, если интересует циклический метод, то можно, начиная с 2005го сервера, запустить вот это
declare @x varchar(100)
set @x = '12345678499999999999999'

;WITH cte AS(
	SELECT 1 as n, CAST(right(@x, 1) as bigint) as c, left(@x, len(@x)-1) as x
UNION ALL
	SELECT n+1, c*CAST(right(x, 1) as bigint), left(x, len(x)-1) FROM cte WHERE len(x) > 0
) SELECT TOP 1 c FROM cte ORDER BY n DESC
для наглядности можно убрать
TOP 1
31 дек 09, 10:48    [8140435]     Ответить | Цитировать Сообщить модератору
 Re: Как перемножить две цифры одного числа?  [new]
Guest1
Member

Откуда: Кристиан Гислер - ТЫ ЛУЧШИЙ !!! :)))
Сообщений: 1342
спасибо за ответ
<Guest1, если интересует циклический метод, то можно, начиная с 2005го сервера, запустить вот это>
в том то и дело , что надо на SQL 2000 и одним select-ом
я тоже думаю, что этот select каким-то образом должен отражать цикл с N, где N-это размерность
поля column, но как это сделать - не представляю. Одним словом я не знаю как на 2000 синтаксически записать этот цикл.
31 дек 09, 11:20    [8140606]     Ответить | Цитировать Сообщить модератору
 Re: Как перемножить две цифры одного числа?  [new]
vino
Member

Откуда:
Сообщений: 1191
Guest1, раз надо в SQL 2000 и одним select-ом, то можно воспользоваться хитрым способом с рекурсией по переменной, правда для просмотра результата тоже нужен select, зато это наиболее точный вариант
declare @x varchar(100)
set @x = '999999999999999999999999999999999999999'
DECLARE @n as decimal(38)

select
  @n = isnull(@n,1)*cast(substring(@x, t.i, 1) as decimal(38))
from 
(
  select
    r0.a*1 + r1.a*2 + r2.a*4 + r3.a*8 + r4.a*16 + r5.a*32 + r6.a*64 i
  from
    (select 0 as a union select 1) r0,
    (select 0 as a union select 1) r1,
    (select 0 as a union select 1) r2,
    (select 0 as a union select 1) r3,
    (select 0 as a union select 1) r4,
    (select 0 as a union select 1) r5,
    (select 0 as a union select 1) r6
) t
where
  t.i > 0 and
  t.i <= len(@x)

SELECT @n
Вариант HandKot математический, но по точности реализации в mssql там проблема c округлением :(
31 дек 09, 13:06    [8140971]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить