আমি কীভাবে টি এসকিউএল-তে কমা দিয়ে একটি সংখ্যা ফর্ম্যাট করব?


199

আমি কিছু প্রশাসনিক ক্যোয়ারী চালাচ্ছি এবং এর থেকে ফলাফল সংকলন করছি sp_spaceused আমার ডাটাবেসে কিছু টেবিলের ডেটা / সূচী স্পেস অনুপাতটি দেখতে এসকিউএল সার্ভার ২০০৮-এর । অবশ্যই আমি ফলাফলগুলিতে সমস্ত ধরণের সংখ্যক পাচ্ছি এবং আমার চোখগুলি চকচকে করতে শুরু করেছে। সত্যিই সুবিধাজনক হবে যদি আমি এই সমস্ত সংখ্যার সাথে কমা দিয়ে ফর্ম্যাট করতে পারি (987654321 987,654,321 হয়ে যায়)। মজার সব এত বছর ধরে আমি SQL সার্ভার ব্যবহার করেছি, এই বিষয়টি কখনো হাল ছেড়ে আসা হয়েছে যেহেতু অধিকাংশ সময় আমি উপস্থাপনা স্তর এ বিন্যাস কাজ করা, কিন্তু এই ক্ষেত্রে SSMS T-SQL এর ফলাফলের হয় উপস্থাপনা।

আমি এটি সমাধান করার জন্য কেবল একটি সাধারণ সিএলআর ইউডিএফ তৈরি করার বিষয়টি বিবেচনা করেছি, তবে মনে হচ্ছে এটি কেবল সাধারণ পুরানো টি-এসকিউএল-তে সক্ষম হওয়া উচিত। সুতরাং, আমি এখানে প্রশ্নটি করব - আপনি ভ্যানিলা টি-এসকিউএলে সংখ্যার বিন্যাস কীভাবে করবেন?


7
"প্রতিবেদনগুলি -> টেবিলের সাহায্যে ডিস্কের ব্যবহার" কী আপনার নান্দনিকভাবে যথেষ্ট উপায়ে খুশীতে প্রয়োজন তা করে?
মার্টিন স্মিথ

1
@ মার্টিন - সত্যিই দুর্দান্ত! এমনকি তাও জানতেন না। আমি প্রায় এক দশক ধরে আমার সাথে আমার কিছু ডিবিএ স্ক্রিপ্ট বহন করেছি, তাই আমি এটি পুরোপুরি মিস করেছি। তবুও, আমি মনে করি এই প্রশ্নটি স্ট্যাকওভারফ্লোতে থাকা টি-এসকিউএল জ্ঞান বেসের একটি গুরুত্বপূর্ণ অংশ, তবে আমার নির্দিষ্ট সমস্যার জন্য এটি সত্যই কার্যকর।
mattmc3

8
এসকিউএল সার্ভার ২০১২ এর সাথে আপনি ফর্ম্যাট () ফাংশনটি ব্যবহার করতে পারেন। উদাহরণস্বরূপ '#, ## .000
ভলভক্স

উত্তর:


185

এসকিউএল সার্ভার ২০১২ এবং এর চেয়েও বেশি, এটি কমা দিয়ে একটি সংখ্যা ফর্ম্যাট করবে:

select format([Number], 'N0')

আপনি 0যে দশমিক স্থান চান তা সংখ্যায়ও পরিবর্তন করতে পারবেন ।


16
formatফাংশনটি চালু হওয়ার পর এটি এখন সেরা উত্তর ।
mattmc3

এটি তৃতীয় (alচ্ছিক) পরামিতিটি মূল্যবান culture
সামিউলে কলম্বো


254

যদিও আমি ওপি সহ সকলের সাথে একমত, যিনি বলছেন যে উপস্থাপনা স্তরটিতে ফর্ম্যাটিং করা উচিত, এই ফর্ম্যাটটি কাস্টিং করে moneyএবং পরে রূপান্তর করে টি-এসকিউএল এ সম্পন্ন করা যায় varchar। এর মধ্যে পেছনের দশমিক অন্তর্ভুক্ত রয়েছে, যদিও এটি লুপ করা যেতে পারে SUBSTRING

SELECT CONVERT(varchar, CAST(987654321 AS money), 1)

12
আমি স্বীকার করি যে সাধারণত ফর্ম্যাটিং অন্য কোথাও হওয়া উচিত, আমরা সকলেই তারিখের ফর্ম্যাটিং ফাংশন গ্রহণ করি। কমা সন্নিবেশ এখানে প্রদর্শিত হিসাবে করা যেতে পারে। +1 টি।
EBarr

4
তবে এটি অন্যান্য মনী-ফর্ম্যাটিং-শৈলীর জন্য কাজ করে না। সুইজারল্যান্ডে আমরা উদাহরণস্বরূপ এই ফর্মটিতে অর্থ লিখি: 987'654'321.00 এটি কীভাবে করবেন?
ড্যানিয়েল

6
আপনি SEP REPLACE (CONVERT (varchar, CAST (987654321 অর্থ হিসাবে), 1), ',', '' '')
হুডি

4
যদিও আমি সম্মত হই যে যেখানে সম্ভব সেখানে উপস্থাপনা স্তরটিতে ফর্ম্যাট করা উচিত, অবশ্যই এমন সময় আছে যেমন Ignite / DPA সতর্কতা সহ, যে ইমেলটি আমি পাই তা উপস্থাপনা স্তর। কোনও জায়গায় কমা রাখার একমাত্র উপায় এটি এসকিউএল এর মাধ্যমে। বিপুল সংখ্যক কমা থাকা এই ক্ষেত্রে অসাধারণভাবে সহায়ক।
সিউডোডোড

1
সবাই আপনাকে "কী" করা উচিত তা বলতে চায়, তবে এটি আপনার নিজের কোড ডিজাইনের বিষয়ে নয়। যদি প্রত্যেকে কেবল "যা করা" উচিত তা করে থাকে, তবে আমরা ন্যূনতম গোলমাল এবং প্রচেষ্টা দিয়ে দ্রুত সমস্যার সমাধান করতে একসাথে জিনিসগুলি হ্যাক করার উদ্ভাবন এবং দক্ষতার এই মনোভাবটি হারাতে পারি।
জেফ গ্রিসওয়াল্ড

59

আমি স্ট্রিং দৈর্ঘ্যের সমস্যাগুলি এড়াতে সাবস্ট্রিংয়ের পরিবর্তে প্রতিস্থাপনের পরামর্শ দেব:

REPLACE(CONVERT(varchar(20), (CAST(SUM(table.value) AS money)), 1), '.00', '')

3
যদিও অর্থ রূপান্তরটি কখনই পরিবর্তন করা উচিত নয়, আমি সাবস্ট্রিংয়ের পরিবর্তে যে প্রতিস্থাপনের প্রস্তাব দেয় সেগুলি ছাড়িয়ে যাওয়ার গ্যারান্টিটি পছন্দ করি।
শান 18

48

SQL সার্ভার 2012+ বাস্তবায়নের জন্য, আপনি ব্যবহার করার ক্ষমতা থাকবে বিন্যাসে অ স্ট্রিং ডেটা প্রকার করার ফর্ম্যাটিং স্ট্রিং প্রযোজ্য হবে।

মূল প্রশ্নে, ব্যবহারকারী হাজার হাজার বিভাজক হিসাবে কমা ব্যবহার করার দক্ষতার জন্য অনুরোধ করেছিলেন। একটি ডুপ্লিকেট প্রশ্ন বন্ধ হয়েছে , ব্যবহারকারী জিজ্ঞাসা করেছিলেন কিভাবে তারা মুদ্রা বিন্যাস প্রয়োগ হতে পারে। নিম্নলিখিত কোয়েরিতে দেখানো হয় যে উভয় কাজ কীভাবে সম্পাদন করতে হয় এটি আরও সাধারণ সমাধান তৈরি করতে সংস্কৃতির প্রয়োগকেও প্রদর্শন করে (গ্রীক বিশেষ বিন্যাস প্রয়োগ করার জন্য সিসিরিডিস ডিমিট্রিসের ফাংশনটিকে সম্বোধন করে)

-- FORMAT
-- http://msdn.microsoft.com/en-us/library/hh213505(v=sql.110).aspx
-- FORMAT does not do conversion, that's the domain of cast/convert/parse etc
-- Only accepts numeric and date/time data types for formatting. 
--
-- Formatting Types
-- http://msdn.microsoft.com/en-us/library/26etazsy.aspx

-- Standard numeric format strings
-- http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
SELECT
    -- c => currency
    -- n => numeric
    FORMAT(987654321, N'N', C.culture) AS some_number
,   FORMAT(987654321, N'c', C.culture) AS some_currency
,   C.culture
FROM
    (
        -- Language culture names
        -- http://msdn.microsoft.com/en-us/library/ee825488(v=cs.20).aspx
        VALUES
            ('en-US')
        ,   ('en-GB')
        ,   ('ja-JP')
        ,   ('Ro-RO')
        ,   ('el-GR')
    ) C (culture);

উপরের জন্য এসকিউএলফিডাল


1
দুর্দান্ত শেয়ার, এটি কাজে আসবে :)
jediCouselor

1
ফিডাল ভেঙে গেছে, এটি এখন বলেছেString index out of range: 33
জেফ পেকেট

1
হ্যাঁ, দুঃখের বিষয় যে এসকিউএল সার্ভারের জন্য ফলকটি আর কাজ করে না। ভাগ্যক্রমে, আপনি এসকিউএল সার্ভারের সাথে সংযুক্ত যে কোনও কোয়েরি সরঞ্জামে উপরেরগুলি আটকানো সক্ষম হতে হবে 2012+
বিলিংক

20

ডেমো ঘ

কমা যোগ করার জন্য প্রদর্শন করে:

PRINT FORMATMESSAGE('The number is: %s', format(5000000, '#,##0'))
-- Output
The number is: 5,000,000

ডেমো 2

কমা এবং দশমিক পয়েন্ট প্রদর্শন করে। পর্যবেক্ষণ করুন যে প্রয়োজনে এটি শেষ অঙ্কটিকে গোল করে।

PRINT FORMATMESSAGE('The number is: %s', format(5000000.759145678, '#,##0.00'))
-- Output
The number is: 5,000,000.76

সঙ্গতি

SQL Server 2012+


2
এটিই সেইটি! লেন (কলাম) পাশাপাশি কেবল কলাম সহ কাজ করে - যেখানে অন্য 2012+ এর সমাধান আমি চেষ্টা করে নি।
গ্রাহাম লাইট

1
গ্রেট! এই (তত্সহ টি-এসকিউএল সাথে ব্যবহারের জন্য, উত্তর আমি খুঁজছিলাম হয় উপর sede )
ashleedawg

10

নীচের প্রশ্নের সাথে চেষ্টা করুন:

SELECT FORMAT(987654321,'#,###,##0')

ডান দশমিক পয়েন্ট সহ ফর্ম্যাট করুন:

SELECT FORMAT(987654321,'#,###,##0.###\,###')

3
হ্যাঁ, এখন আমাদের ঠিক মতো FORMATকাজটি ফাংশনটি হ'ল SELECT format(123456789987654321,'###,##0')বা আরও সহজভাবে, select format(123456789987654321, 'N0')যেমন @ থমাসমিলার উত্তর দিয়েছেন।
mattmc3

ফর্ম্যাট একটি পারফরম্যান্স দুঃস্বপ্ন - আপনি এটি ব্যবহার শুরু করেন এবং এর উপর নির্ভর করেন, তারপরে আপনার ডেটাবেসটি স্কেল করতে পারে না তা সন্ধান করুন। এবং এখন এটি এক ডজন বৈশিষ্ট্য হিসাবে নির্মিত এবং আপনি এড়াতে পারবেন না। ফর্ম্যাট কখনও ব্যবহার করবেন না।
Pxtl

9
SELECT REPLACE(CONVERT(varchar(20), (CAST(9876543 AS money)), 1), '.00', '')

আউটপুট = 9,876,543

এবং আপনি আপনার কলামের নাম দিয়ে 9876543 প্রতিস্থাপন করতে পারেন।


7

উপরের অর্থের কৌশলটি চেষ্টা করে দেখুন এবং এটি দুটি বা কম উল্লেখযোগ্য সংখ্যাসহ সংখ্যার মানগুলির জন্য দুর্দান্ত কাজ করে। দশমিকের সাথে সংখ্যার ফর্ম্যাট করতে আমি আমার নিজস্ব ফাংশন তৈরি করেছি:

CREATE FUNCTION [dbo].[fn_FormatWithCommas] 
(
    -- Add the parameters for the function here
    @value varchar(50)
)
RETURNS varchar(50)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @WholeNumber varchar(50) = NULL, @Decimal varchar(10) = '', @CharIndex int = charindex('.', @value)

    IF (@CharIndex > 0)
        SELECT @WholeNumber = SUBSTRING(@value, 1, @CharIndex-1), @Decimal = SUBSTRING(@value, @CharIndex, LEN(@value))
    ELSE
        SET @WholeNumber = @value

    IF(LEN(@WholeNumber) > 3)
        SET @WholeNumber = dbo.fn_FormatWithCommas(SUBSTRING(@WholeNumber, 1, LEN(@WholeNumber)-3)) + ',' + RIGHT(@WholeNumber, 3)



    -- Return the result of the function
    RETURN @WholeNumber + @Decimal

END

4

এটি ফিল হান্টের উত্তরের একটি মন্তব্যে অন্তর্ভুক্ত তবে হায়রে আমার কাছে এই প্রতিনিধিত্ব নেই।

আপনার সংখ্যা স্ট্রিংয়ের শেষে ".00" কে ছাঁটাই করতে পার্সনামটি হ্যান্ড-হ্যান্ডি। এটি পিরিয়ড-সীমাবদ্ধ স্ট্রিংগুলিকে টোকেনাইজ করে এবং উপাদান 1 হিসাবে ডানদিকের টোকেন দিয়ে শুরু করে নির্দিষ্ট উপাদানটি দেয়।

SELECT PARSENAME(CONVERT(varchar, CAST(987654321 AS money), 1), 2)

ফলস "987,654,321"


3

এখানে আরেকটি টি-স্কেল ইউডিএফ

CREATE FUNCTION dbo.Format(@num int)
returns varChar(30)
As
Begin
Declare @out varChar(30) = ''

  while @num > 0 Begin
      Set @out = str(@num % 1000, 3, 0) + Coalesce(','+@out, '')
      Set @num = @num / 1000
  End
  Return @out
End

2
`/* Author: Tsiridis Dimitris */
/* Greek amount format. For the other change the change on replace of '.' & ',' */
CREATE FUNCTION dbo.formatAmount  (
@amtIn as varchar(20)
) RETURNS varchar(20)
AS
BEGIN 

return cast(REPLACE(SUBSTRING(CONVERT(varchar(20), CAST(@amtIn AS money), 1),1,
LEN(CONVERT(varchar(20), CAST(@amtIn AS money), 1))-3), ',','.')
 + replace(RIGHT(CONVERT(varchar(20), CAST(@amtIn AS money), 1),3), '.',',') AS VARCHAR(20))

END

SELECT [geniki].[dbo].[formatAmount]('9888777666555.44')`

1

এখানে আমি একটি স্কেলার ফাংশন ব্যবহার করছি যা পূর্ববর্তী উদাহরণে (উপরে) কিছু বাগগুলি সংশোধন করে এবং দশমিক মানগুলিও (অঙ্কের নির্দিষ্ট # টিতে) পরিচালনা করে (0 ও নেতিবাচক সংখ্যার সাহায্যেও সম্পাদনা করে)। অন্য একটি নোট, উপরের অর্থ পদ্ধতি হিসাবে theালাই কেবল অর্থের ধরণের আকারের মধ্যে সীমাবদ্ধ এবং 4 (বা আরও) সংখ্যার দশমিকের সাথে কাজ করে না। এই পদ্ধতিটি অবশ্যই সহজতর তবে কম নমনীয়।

CREATE FUNCTION [dbo].[fnNumericWithCommas](@num decimal(38, 18), @decimals int = 4) RETURNS varchar(44) AS
BEGIN
    DECLARE @ret varchar(44)

    DECLARE @negative bit; SET @negative = CASE WHEN @num < 0 THEN 1 ELSE 0 END

    SET @num = abs(round(@num, @decimals)) -- round the value to the number of decimals desired
    DECLARE @decValue varchar(18); SET @decValue = substring(ltrim(@num - round(@num, 0, 1)) + '000000000000000000', 3, @decimals)
    SET @num = round(@num, 0, 1) -- truncate the incoming number of any decimals
    WHILE @num > 0 BEGIN
        SET @ret = str(@num % 1000, 3, 0) + isnull(','+@ret, '')
        SET @num = round(@num / 1000, 0, 1)
    END
    SET @ret = isnull(replace(ltrim(@ret), ' ', '0'), '0') + '.' + @decValue
    IF (@negative = 1) SET @ret = '-' + @ret

    RETURN @ret
END

GO

1

আর একটি ইউডিএফ যা আশাবাদী যথেষ্ট জেনেরিক এবং আপনি নির্দিষ্ট সংখ্যক দশমিক স্থানে গোল করতে চান কিনা তা নিয়ে অনুমান করা যায় না:

CREATE FUNCTION [dbo].[fn_FormatNumber] (@number decimal(38,18))

RETURNS varchar(50)

BEGIN
    -- remove minus sign before applying thousands seperator
    DECLARE @negative bit
    SET @negative = CASE WHEN @number < 0 THEN 1 ELSE 0 END
    SET @number = ABS(@number)

    -- add thousands seperator for every 3 digits to the left of the decimal place
    DECLARE @pos int, @result varchar(50) = CAST(@number AS varchar(50))
    SELECT @pos = CHARINDEX('.', @result)
    WHILE @pos > 4
    BEGIN
        SET @result = STUFF(@result, @pos-3, 0, ',')
        SELECT @pos = CHARINDEX(',', @result)
    END

    -- remove trailing zeros
    WHILE RIGHT(@result, 1) = '0'
        SET @result = LEFT(@result, LEN(@result)-1)
    -- remove decimal place if not required
    IF RIGHT(@result, 1) = '.'
        SET @result = LEFT(@result, LEN(@result)-1)

    IF @negative = 1
        SET @result = '-' + @result

    RETURN @result
END

0
/*
  #------------------------------------------------------------------------#
  #            SQL Query Script                                            #
  #            ----------------                                            #
  # Funcion.:  dbo.fn_nDerecha ( Numero, Pos_Enteros, Pos_Decimales )      #
  #    Numero        : es el Numero o Valor a formatear                    #
  #    Pos_Enteros   : es la cantidad posiciones para Enteros              #
  #    Pos_Decimales : es la cantidad posiciones para Decimales            #
  #                                                                        #
  # OBJETIVO:  Formatear los Numeros con Coma y Justificado a la Derecha   #
  #  Por Ejemplo:                                                          #
  #   dbo.fn_nDerecha ( Numero, 9, 2 )         Resultado = ---,---,--9.99  #
  #               dado  Numero = 1234.56       Resultado =       1,234.56  #
  #               dado  Numero = -1.56         Resultado =          -1.56  #
  #               dado  Numero = -53783423.56  Resultado = -53,783,423.56  #
  #                                                                        #
  # Autor...:  Francisco Eugenio Cabrera Perez                             #
  # Fecha...:  Noviembre 25, 2015                                          #
  # Pais....:  Republica Dominicana                                        #
  #------------------------------------------------------------------------#
*/



CREATE FUNCTION [dbo].[fn_nDerecha]
(
    -- Agregue Argumentos, para personalizar la funcion a su conveniencia
    @Numero_str    varchar(max)
   ,@Pos_Enteros   int
   ,@Pos_Decimales int
)
RETURNS varchar(max)
AS
BEGIN
  --  Declare la variable del RETURN aqui, en este caso es RESULT
  declare @RESULTADO varchar(max)
  set     @RESULTADO = '****'

  -----------------------------------------------  --
  declare @Numero_num numeric(28,12)
  set     @Numero_num =
  (
  case when isnumeric(@Numero_str) = 0 
       then 0
       else round (convert( numeric(28,12), @Numero_str), @Pos_Decimales)
  end
  )
  --  -----------------------------------------------  --
  --  Aumenta @Pos_Enteros de @RESULTADO,
  --      si las posiciones de Enteros del dato @Numero_str es Mayor...
  --
  declare   @Num_Pos_Ent int
  set       @Num_Pos_Ent = len ( convert( varchar, convert(int, abs(@Numero_num) ) ) )
  --
  declare   @Pos_Ent_Mas int
  set       @Pos_Ent_Mas =
  (
  case when @Num_Pos_Ent > @Pos_Enteros
       then @Num_Pos_Ent - @Pos_Enteros
       else 0
  end
  )
  set       @Pos_Enteros = @Pos_Enteros + @Pos_Ent_Mas
  --
  --  -----------------------------------------------  --
  declare @p_Signo_ctd       int
  set     @p_Signo_ctd       = (case when @Numero_num < 1 then 1 else 0 end)
  --
  declare @p_Comas_ctd       int
  set     @p_Comas_ctd       = ( @Pos_Enteros - 1 ) / 3
  --
  declare @p_Punto_ctd       int
  set     @p_Punto_ctd       = (case when @Pos_Decimales > 0 then 1 else 0 end)
  --
  declare @p_input_Longitud  int
  set     @p_input_Longitud  = ( @p_Signo_ctd + @Pos_Enteros ) +
                                 @p_Punto_ctd + @Pos_Decimales
  --
  declare @p_output_Longitud int
  set     @p_output_Longitud = ( @p_Signo_ctd + @Pos_Enteros   + @p_Comas_ctd )
                             + ( @p_Punto_ctd + @Pos_Decimales )
  --
  --  ===================================================================  --


  declare @Valor_str varchar(max)
  set     @Valor_str = str(@Numero_num, @p_input_Longitud, @Pos_Decimales)

  declare @V_Ent_str varchar(max)
  set     @V_Ent_str = 
  (case when @Pos_Decimales > 0 
        then substring( @Valor_str, 0, charindex('.', @Valor_str, 0) )
        else            @Valor_str end)
  --
  declare @V_Dec_str varchar(max)
  set     @V_Dec_str = 
  (case when @Pos_Decimales > 0 
        then '.' + right(@Valor_str, @Pos_Decimales)
        else '' end)
  --
  set @V_Ent_str = convert(VARCHAR, convert(money, @V_Ent_str), 1) 
  set @V_Ent_str = substring( @V_Ent_str, 0, charindex('.', @V_Ent_str, 0) )
  --


  set @RESULTADO    = @V_Ent_str + @V_Dec_str 
  --
  set @RESULTADO = ( replicate( ' ', @p_output_Longitud - len(@RESULTADO) ) + @RESULTADO )
  --

  --  ===================================================================  -

- ================================================= ==================== -

  RETURN @RESULTADO
END

  --  ===================================================================  --

/ * এই ফাংশনটিতে 3 টি আর্গুমেন্ট দরকার: প্রথম আর্গুমেন্টটি হ'ল নিউমরো_স্ট্রার যা ডাটা ইনপুট হিসাবে নম্বর এবং অন্য 2 টি আর্গুমেন্ট নির্দিষ্ট করে আউটপুটটির জন্য কীভাবে তথ্য ফর্ম্যাট করা হবে, সেগুলি আর্গুমেন্টগুলি @ পোস_এন্টেরোস এবং @ পোস_ডেসিমেলগুলি উল্লেখ করে যা কতটি নির্দিষ্ট করে আপনি যে সংখ্যার ইনপুট আর্গুমেন্ট হিসাবে পাস করেন সেই সংখ্যার জন্য আপনি পূর্ণসংখ্যার এবং দশমিক স্থানগুলি প্রদর্শন করতে চান। * /


0

এসকিউএল সার্ভারের জন্য ২০১২ এর আগে যা ফরমেট ফাংশনটি অন্তর্ভুক্ত করে না, এই ফাংশনটি তৈরি করুন:

CREATE FUNCTION FormatCurrency(@value numeric(30,2))
    RETURNS varchar(50)
    AS
    BEGIN
        DECLARE @NumAsChar VARCHAR(50)
        SET @NumAsChar = '$' + CONVERT(varchar(50), CAST(@Value AS money),1)
        RETURN @NumAsChar
    END 

নির্বাচন করুন dbo. ফরমেট কারুকেন্সি (12345678) $ 12,345,678.00 প্রদান করে

যদি আপনি কেবল কমা চান তবে ড্রপ করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.