मैं टी-एसक्यूएल में अल्पविराम के साथ एक संख्या कैसे प्रारूपित करूं?


201

मैं sp_spaceusedअपने डेटाबेस में कुछ तालिकाओं के डेटा / इंडेक्स स्पेस अनुपात को देखने के लिए SQL सर्वर 2008 से कुछ प्रशासनिक प्रश्न और संकलन परिणाम चला रहा हूं । बेशक मुझे परिणामों में सभी प्रकार की बड़ी संख्या मिल रही है और मेरी आँखें चमकने लगी हैं। यह वास्तव में सुविधाजनक होगा अगर मैं कॉमा के साथ उन सभी नंबरों को प्रारूपित कर सकता हूं (987654321 987,654,321 बन जाता है)। अजीब बात है कि सभी कई वर्षों मैं एसक्यूएल सर्वर का उपयोग किया है में, इस मुद्दे को कभी नहीं आ गया है के बाद से ज्यादातर समय मैं प्रस्तुति परत पर स्वरूपण कर रहे होते, लेकिन इस मामले में SSMS में T-SQL परिणाम है प्रस्तुति।

मैंने इसे हल करने के लिए सिर्फ एक साधारण सीएलआर यूडीएफ बनाने पर विचार किया है, लेकिन ऐसा लगता है कि यह सिर्फ सादे पुराने टी-एसक्यूएल में सक्षम होना चाहिए। तो, मैं यहाँ सवाल उठाता हूँ - आप वैनिला टी-एसक्यूएल में संख्यात्मक स्वरूपण कैसे करते हैं?


7
क्या "रिपोर्ट -> डिस्क का उपयोग तालिका" से आपको सौंदर्य की दृष्टि से पर्याप्त रूप से प्रसन्न करने की आवश्यकता है?
मार्टिन स्मिथ

1
@ मर्टिन - सच में कमाल! यह भी नहीं पता था कि अस्तित्व में है। मैंने अपनी कुछ DBA स्क्रिप्ट्स को लगभग एक दशक तक अपने साथ रखा है, इसलिए मैं पूरी तरह से चूक गया। फिर भी, मुझे लगता है कि यह प्रश्न स्टैकओवरफ़्लो पर टी-एसक्यूएल ज्ञान के आधार का एक महत्वपूर्ण हिस्सा है, लेकिन मेरी विशिष्ट समस्या के लिए यह वास्तव में आसान है।
मैटम

8
SQL सर्वर 2012 + के साथ आप FORMAT () फ़ंक्शन का उपयोग कर सकते हैं। जैसे '#, ##। 000' msdn.microsoft.com/en-us/library/hh213505.aspx
Volvox

जवाबों:


187

SQL सर्वर 2012 और उच्चतर में, यह कॉमा के साथ एक नंबर को प्रारूपित करेगा:

select format([Number], 'N0')

आप अपने 0इच्छित दशमलव स्थानों की संख्या में भी परिवर्तन कर सकते हैं।


16
formatफ़ंक्शन की शुरुआत के बाद से यह अब सबसे अच्छा जवाब है ।
मैट्मक 3

यह तीसरे (वैकल्पिक) पैरामीटर को ध्यान देने योग्य है culture
सैम्यूले कोलंबो

ओपी निर्दिष्ट एसक्यूएल सर्वर 2008
फोरमैरो

254

जबकि मैं ओपी सहित सभी से सहमत हूं, जो कहता है कि प्रस्तुति परत में स्वरूपण किया जाना चाहिए, इस स्वरूपण को टी-एसक्यूएल में कास्टिंग करके moneyऔर फिर परिवर्तित करके पूरा किया जा सकता है varchar। इसमें अनुगामी दशमलव शामिल है, हालांकि, इसके साथ बंद किया जा सकता है SUBSTRING

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

12
जबकि मैं सहमत हूं कि आम तौर पर स्वरूपण कहीं और होना चाहिए, हम सभी को प्रारूपित कार्यों की तारीख देते हैं। यहाँ दिखाए अनुसार कोमा सम्मिलन किया जा सकता है। +1।
EBarr

4
हालाँकि, यह अन्य मॉनी-स्वरूपण-शैलियों के लिए काम नहीं करता है। स्विट्जरलैंड में हम इस रूप में उदाहरण के लिए मनी लिखते हैं: 987'654'321.00 कैसे करें?
डेनियल

6
आप एक बदला हुआ रिप्लेसे (CONVERT (varchar, CAST (987654321 AS money), 1), ',', '' '') कर सकते हैं
Hoody

4
हालांकि मैं मानता हूं कि जहां संभव हो, प्रेजेंटेशन लेयर में फॉर्मेटिंग की जानी चाहिए, निश्चित रूप से ऐसे समय होते हैं, जैसे कि इग्नाइट / डीपीए अलर्ट के साथ, जो ईमेल मुझे प्राप्त होता है, वह प्रेजेंटेशन लेयर है। कमल को एक जगह पर रखने का एकमात्र तरीका एसक्यूएल के माध्यम से है। बड़ी संख्या में अल्पविराम उन मामलों में असाधारण रूप से सहायक है।
छद्मटोड

1
हर कोई आपको बताना चाहता है कि "क्या" किया जाना चाहिए, लेकिन ऐसा नहीं है कि आपका अपना कोड किस बारे में है। यदि हर किसी ने केवल "क्या" किया जाना चाहिए, तो हम कम से कम उपद्रव और प्रयास के साथ एक समस्या को हल करने के लिए चीजों को हैक करने के लिए आविष्कार की भावना और क्षमता को खो देते हैं।
ज्योफ ग्रिसवल्ड

59

मैं स्ट्रिंग लंबाई के मुद्दों से बचने के लिए प्रतिस्थापित करने के बदले प्रतिस्थापित करने की सलाह दूंगा:

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

3
भले ही धन रूपांतरण कभी भी बदलना नहीं चाहिए, मुझे पसंद है कि प्रतिस्थापन की पेशकश की सीमा से बाहर नहीं जाने की गारंटी।
शॉन

48

SQL सर्वर 2012+ कार्यान्वयन के लिए, आपके पास FORMAT का उपयोग करने की क्षमता होगी स्ट्रिंग प्रारूपण को गैर-स्ट्रिंग डेटा प्रकारों पर लागू करने के का ।

मूल प्रश्न में, उपयोगकर्ता ने हजारों विभाजक के रूप में अल्पविराम का उपयोग करने की क्षमता का अनुरोध किया था। डुप्लिकेट प्रश्न के रूप में एक बंद में , उपयोगकर्ता ने पूछा था कि वे मुद्रा प्रारूपण कैसे लागू कर सकते हैं। निम्न क्वेरी से पता चलता है कि दोनों कार्यों को कैसे करना है। यह इसे और अधिक सामान्य समाधान बनाने के लिए संस्कृति के अनुप्रयोग को प्रदर्शित करता है (ग्रीक विशेष प्रारूपण लागू करने के लिए Tsiridis दिमित्रिस के समारोह को संबोधित करते हुए)

-- 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);

उपरोक्त के लिए SQLFiddle


1
बढ़िया हिस्सा, यह काम आएगा :)
jediCLCor

1
फिडल टूट गया है, अब यह कहता हैString index out of range: 33
जेफ पकेट

1
@JeffPuckettII हाँ, यह अफ़सोस की बात है कि SQL सर्वर के लिए फ़ेल्ड अब काम नहीं करता है। सौभाग्य से, आप उपरोक्त को किसी भी क्वेरी टूल में डाल सकते हैं जो SQL Server 2012+ से जुड़ा है
बिलिंक

20

डेमो 1

अल्पविराम जोड़ते हुए प्रदर्शित करता है:

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
महान! यह (सहित T-SQL साथ प्रयोग के लिए, इस सवाल का जवाब मैं खोज रहा था है पर SEDE )
ashleedawg

10

कृपया नीचे क्वेरी के साथ प्रयास करें:

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

सही दशमलव बिंदु के साथ प्रारूप:

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

3
हां, हमारे पास FORMATफ़ंक्शन का सही तरीका है SELECT format(123456789987654321,'###,##0'), select format(123456789987654321, 'N0')जैसे @ThomasMueller ने उत्तर दिया है।
14m में मैटमैक्स 3

FORMAT एक प्रदर्शन दुःस्वप्न है - आप इसका उपयोग करना शुरू करते हैं और इस पर निर्भर करते हैं, फिर पाते हैं कि आपका डेटाबेस स्केल नहीं कर सकता है। और अब यह एक दर्जन सुविधाओं में बनाया गया है और आप इससे बच नहीं सकते। कभी भी FORMAT का उपयोग न करें।
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

यहाँ एक और t-sql UDF है

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 और नकारात्मक संख्याओं के साथ काम करने के लिए भी)। एक अन्य नोट, ऊपर धन विधि के रूप में डाली गई धनराशि डेटा प्रकार के आकार तक सीमित है, और 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 तर्कों की आवश्यकता है: पहला तर्क है @Numero_str जिसे डेटा इनपुट के रूप में संख्या, और अन्य 2 तर्क निर्दिष्ट करते हैं कि आउटपुट के लिए जानकारी कैसे स्वरूपित की जाएगी, वे तर्क @Pos_Enosos और @Pos_Decimales हैं जो निर्दिष्ट करते हैं कि कितने इंटेगर और डेसीमल स्थानों को आप उस नंबर के लिए दिखाना चाहते हैं जिसे आप इनपुट तर्क के रूप में पास करते हैं। * /


0

SQL सर्वर 2012 से पहले जिसमें FORMAT फ़ंक्शन शामिल नहीं है, इस फ़ंक्शन को बनाएं:

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.FormatCurrency (12345678) $ 12,345,678.00 का चयन करें

यदि आप सिर्फ अल्पविराम चाहते हैं तो $ गिराएं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.