PDA

View Full Version : Digit Grouping- گروه بندی اعداد



بهنام بهمنی
شنبه 03 اردیبهشت 1384, 15:52 عصر
آیا کسی تابعی برای SQl دارد که یک عدد را از ورودی گرفته و آن عدد را سه رقم ، سه رقم جدا کرده و به خروجی بفرستد .

بطور مثال در ستون Amount اعداد ذخیره شده اند ، پس از بکار بردن تابع مورد نیاز خروجی بصورت زیر بدهد :

Select GroupDigit(Amount) From tblTest

Result------------------------------------
123,000
1,234,654
....
...
.

پیشاپیش از کمک شما متشکرم

.

vadood
شنبه 03 اردیبهشت 1384, 19:14 عصر
چرا می خواهید عدد را فرمت شده از دیتابیس بگیرید؟ بهتر نیست هنگام نماش mask اعمال کنید؟

بهنام بهمنی
یک شنبه 04 اردیبهشت 1384, 08:00 صبح
چون خروجی اش را در محیط ها مختلف می خواهم نشان دهم . و لذا می خواهم از مبدا این اتفاق بیفتد .

AminSobati
یک شنبه 04 اردیبهشت 1384, 18:57 عصر
یعنی نوشتن این تابع اینقدر سخته؟!

titbasoft
یک شنبه 04 اردیبهشت 1384, 20:57 عصر
یعنی نوشتن این تابع اینقدر سخته؟!
گمان نمی کنم. ولی بعضی وقتها یه اتفاق هایی میافته که آدم از شوق جواب دادن میافته (البته هیچ مشکلی با این تاپیک ندارم دلم از جای دیگه ای پر بود) ولی این حرف شما خیلی به آدم انگیزه می ده. اینم 2 تا جواب:



declare @n int
set @n=1878798
declare @r varchar(30)
set @r=''
while(@n!=0)
begin
set @r = cast((@n % 1000) as varchar(3)) + '''' + @r
set @n = @n / 1000
end
print @r

declare @n int
set @n=1878798
declare @r varchar(30)
set @r=cast(@n as varchar(30))
declare @l int
set @l=len(@r)-2
while(@l>0)
begin
set @r = stuff (@r,@l,0,'''')
set @l=@l-3
end
print @r

بهنام بهمنی
شنبه 10 اردیبهشت 1384, 11:36 صبح
از پاسخ شما متشکرم

محمد سلیم آبادی
سه شنبه 20 مرداد 1388, 14:52 عصر
این روش رو امتحان کن.



declare @s nvarchar(2000),
@a nvarchar(2000),
@i int;
set @s=
'13984649846513215647987987'+
'651316549897464532156498798'+
'46543219874554654897856432'
set @i=len(@s);
set @a=reverse(@s)
set @i=0;
set @s='';
while((@i*3+1)<=len(@a))
begin
set @s=@s+substring(@a,3*@i+1,3)+',';
set @i=@i+1
end
set @a=reverse(@s)
select substring(@a,2,len(@a))





1,398,464,984,651,321,564,798,798,765,131,654,989, 746,453,215,649,879,846,543,219,874,554,654,897,85 6,432

محمد سلیم آبادی
سه شنبه 20 مرداد 1388, 16:46 عصر
اینم یک روش دیگر.
شاید به نظر یکمی پیچیده باشد ولی باید سرعت اجرای بالایی داشته باشد.


DECLARE @a NVARCHAR(4000)
SET @a=reverse('41241241234132564565675696709674533474 553563756346356857'
+'464645643634634634645646464646456464646456464364 364645645436'+
'4563464564564563466456456456434563534686845554868 34584563464');

WITH Navigation AS (
SELECT
cast('' as nvarchar(4000)) AS [value]
,0 AS [Level]

UNION ALL SELECT
n.[value]+','+substring(@a,3*[level]+1,3) AS [value]
, n.[level] + 1 AS [level]
FROM
Navigation n
WHERE
[level] < len(@a)/3.0
)

SELECT TOP 1 substring(reverse([value]),1,len([value])-1)
FROM Navigation
ORDER BY [Level] DESC






41,241,241,234,132,564,565,675,696,709,674,533,474 ,553,563,756,346,356,857,464,645,643,634,634,634,6 45,646,464,646,456,464,646,456,464,364,364,645,645 ,436,456,346,456,456,456,346,645,645,645,643,456,3 53,468,684,555,486,834,584,563,464