2012-11-06 115 views
11

Come posso convertire i valori decimali con alcune virgole?Posizioni decimali in formato SQL Server con virgole

this Mi aiuta. Ma il mio problema i decimali sono impostati su 2 only..I vogliono il decimali da 2, 3, o 4..example

1,234.123 or 1,234.12345 

ho provato

convert(varchar, convert(decimal(18, 4), 1234.1234567), 1) 

uscita: 1234,1234

Non c'è una virgola. Ma se io uso i soldi del decimale sono 2 solo

convert (varchar, convertire (denaro, 1234,1234,567 mila), 1)

uscita: 1,234.12

+3

I numeri non hanno formati. Ottengono la formattazione *** *** *** quando li converti in una stringa, che viene eseguita per la presentazione. E il tuo livello dati non dovrebbe preoccuparsi della presentazione. È ummm, a cosa serve uno strato di presentazione. Da SQL è necessario restituire il tipo di dati nativi e convertirlo solo per la presentazione nel front-end. * [Questo aiuta il debug, le prestazioni, l'architettura attraverso il disaccoppiamento, la manutenibilità, la flessibilità/adattabilità, ecc. Ecc ...] * – MatBailie

+1

Concordato sul livello di presentazione, ma ci sono casi validi. Devo costruire query ad hoc in SSMS e poi inviare per e-mail i risultati. Questo è un passo in meno di cui ho bisogno per occuparmi prima di inviare le e-mail. –

+0

Sono d'accordo; la formattazione dovrebbe essere eseguita nel livello di presentazione. Ma SSMS È il livello di presentazione qui. Inoltre, scrivo query ad-hoc e poi incollo il risultato in un foglio di calcolo per "utente finale", ovvero capo e/o ragioniere. Ora ho difficoltà perché SSMS crea punti decimali e il foglio di calcolo richiede virgole decimali. Idealmente, dovrei o con "SET DECIMAL_FORMAT =" DA_dk "o qualche opzione in SSMS essere in grado di cambiare il formato decimale .. –

risposta

11

senza considerare che si tratta di una buona idea ...

select dbo.F_AddThousandSeparators(convert(varchar, convert(decimal(18, 4), 1234.1234567), 1)) 

Funzione

-- Author:  bummi 
-- Create date: 20121106 
CREATE FUNCTION F_AddThousandSeparators(@NumStr varchar(50)) 
RETURNS Varchar(50) 
AS 
BEGIN 
declare @OutStr varchar(50) 
declare @i int 
declare @run int 

Select @i=CHARINDEX('.',@NumStr) 
if @i=0 
    begin 
    set @i=LEN(@NumStr) 
    Set @Outstr='' 
    end 
else 
    begin 
    Set @Outstr=SUBSTRING(@NUmStr,@i,50) 
    Set @[email protected] -1 
    end 


Set @run=0 

While @i>0 
    begin 
     if @Run=3 
     begin 
      Set @Outstr=','[email protected] 
      Set @run=0 
     end 
     Set @Outstr=SUBSTRING(@NumStr,@i,1) [email protected] 
     Set @[email protected] 
     Set @[email protected] + 1  
    end 

    RETURN @OutStr 

END 
GO 
+2

Upvoted per dare effettivamente una soluzione mentre avviso che non è il modo migliore per farlo! – callisto

-1

SQL (o per essere più precisi, RDBMS) non è destinato a essere la scelta giusta per la formattazione dell'output. Il database dovrebbe fornire dati grezzi che dovrebbero quindi essere formattati (o più generali: elaborati) nell'applicazione di destinazione.

Tuttavia, a seconda del sistema specifico utilizzato, è possibile scrivere una UDF (funzione definita dall'utente) per ottenere ciò che si desidera. Ma tieni presente che in effetti stai restituendo un varchar, che non sarai in grado di elaborare ulteriormente (ad esempio riassumendo).

+2

" SQL..non è pensato per essere la scelta giusta per la formattazione dell'output "- Sì Questo è il vero problema: anche la formattazione dell'output nell'interfaccia utente è molto più semplice – callisto

+0

Questa non è una risposta, solo che è possibile fare. –

+0

Ribadendo ciò che ha detto D-Money, questa non è una risposta – Alban

20

fortuna (?), In SQL Server 2012+, è ora possibile utilizzare per raggiungere FORMAT() this:

FORMAT(@s,'#,0.0000') 


Nelle versioni precedenti, con il rischio di guardare davvero brutta

[Richiesta]:

declare @s decimal(18,10); 
set @s = 1234.1234567; 
select replace(convert(varchar,cast(floor(@s) as money),1),'.00', 
    '.'+right(cast(@s * 10000 +10000.5 as int),4)) 

Nella prima parte, usiamo monetario> VARCHAR per produrre le virgole, ma FLOOR() è usato per assicurare che i decimali vadano a .00. Questo è facilmente identificabile e sostituito con le 4 cifre dopo il decimale utilizzando una combinazione di spostamento (*10000) e CAST come INT (troncatura) per ricavare le cifre.

[risultati]:

| COLUMN_0 | 
-------------- 
| 1,234.1235 | 

Ma se non si dispone di distribuire i report di business utilizzando SQL Server Management Studio o SQLCMD, questo è MAI la soluzione corretta, anche se si può fare. Qualsiasi ambiente front-end o di reporting ha funzioni appropriate per gestire la formattazione della visualizzazione.

+1

Al primo passaggio, non sono riuscito a trovare un collegamento alla documentazione che descrive la convenzione di formattazione specifica (per la stringa '#, 0.0000'). Il link * è * sepolto nella pagina di riferimento, ma mi ci è voluto un po 'per trovarlo. la comodità degli altri, eccola: [Custom Numeric Format Strings] (https://msdn.microsoft.com/library/0c899ak8.aspx) – kmote

+0

In alternativa, puoi usare questo come stringa di sostituzione '.00':' SUBSTRING (CONVERT (VarChar, @ s-FLOOR (@s) +0,00005), 2,1 + 4) 'che ti darà il' .1235' - Trovo che sia più ovvio in relazione all'effettivo ammontare di arrotondamento applicato, anche se forse non abbastanza chiaramente chiaro riguardo al numero di cifre decimali '+ 4' specificato. E naturalmente questo funziona solo correttamente con importi positivi :) –

2

Se si utilizza SQL Azure Reporting Services, la funzione "formato" non è supportata. Questo è davvero l'unico modo per formattare un suggerimento in un grafico in SSRS. Quindi la soluzione è di restituire una colonna che presenta una rappresentazione di stringa del numero formattato da utilizzare per il suggerimento. Quindi, sono d'accordo che SQL non è il posto per la formattazione. Tranne in casi come questo in cui lo strumento non ha funzioni adeguate per gestire la formattazione del display.

Nel mio caso ho bisogno di mostrare un numero formattato con virgole e senza decimali (tipo decimali 2) e finito con questo gioiello di una colonna calcolata nella mia query del set:

, Fmt_DDS = invertire (roba (reverse (CONVERT (varchar (25), cast (SUM (kv.DeepDiveSavingsEst) come denaro), 1)), 1, 3, ''))

Funziona, ma è molto brutto e non ovvio per chiunque mantiene il rapporto lungo la strada. Yay Cloud!

4

Da un correlato SO domanda: Format a number with commas but without decimals in SQL Server 2008 R2?

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

Questo è stato testato in SQL Server 2008 R2.

+0

Il denaro è considerato un formato non valido e tende a fudge i risultati in certi casi quando si eseguono determinate operazioni con questi valori. Anche la stessa Microsoft consiglia di NON usare quel tipo. –

+0

@JurijsKastanovs, sono d'accordo, non fare calcoli o memorizzare i dati utilizzando denaro.Ma se hai un requisito specifico per formattare un numero nel livello dati (forse per la visualizzazione in SSMS), questo è un modo per farlo. Dovrebbe essere l'ultima operazione eseguita sui dati. –

Problemi correlati