Arrotondamento colonna calcolata

mercoledì 10 marzo 2010 - 15.09

Ciunino Profilo | Newbie

Ciao a tutti, scusate la domanda stupida ma mi affaccio a sqlserver (ho il 2008) da molto poco.

Non riesco a capire perchè le due query seguenti non mi restituiscono valori decimali.

SELECT convert(decimal(5,3),100/8) as result ----> da come risultato 12.000 invece di 12.500
SELECT round(100/8,5) as result ----> da come risultato 12 anzichè 12.5

Ora, tale funzionalità mi serve per creare una vista con dei valori percentuali, quindi i valori decimali mi servono proprio....

Qualche anima buona può dirmi dove sbaglio !!??

Grazi e a tutti per l'aiuto!

lbenaglia Profilo | Guru

>Non riesco a capire perchè le due query seguenti non mi restituiscono
>valori decimali.
>
>SELECT convert(decimal(5,3),100/8) as result ----> da come
>risultato 12.000 invece di 12.500

Ciao Luca,

Perché stai eseguendo una divisione tra due numeri interi 100/8 e converti l'output in un numero decimale.
Dato che la divisione tra interi restituisce un intero, anche se lo converti in decimale otterrai 0 come parte decimale.
Per risolvere è sufficiente trasformare il dividendo, il divisore o entrambi in numeri decimali:

SELECT CAST(100/8. AS decimal(5,3)) AS result; /* Output: result --------------------------------------- 12.500 (1 row(s) affected) */


>SELECT round(100/8,5) as result ----> da come risultato 12
>anzichè 12.5
Anche in questo caso risolvi trasformando ad esempio il divisore in numero decimale:

SELECT round(100/8., 5) as result /* Output: result --------------------------------------- 12.500000 (1 row(s) affected) */
>Grazi e a tutti per l'aiuto!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Ciunino Profilo | Newbie

grande! il primo passettino è fatto, ed è già una gran cosa!
Però non riesco ad applicare la stessa soluzione quando i valori provengono da campi o campi calcolati
Cioè, (visto che mi spiego da schifo), dovrei fare una cosa del tipo:

SELECT CampoA/(SELECT COUNT(CampoB) FROM TabellaA)

ed avere un valore decimal come risultato...

Pietà ma proprio non ci riesco

lbenaglia Profilo | Guru

>Cioè, (visto che mi spiego da schifo), dovrei fare una cosa del
>tipo:
>
>SELECT CampoA/(SELECT COUNT(CampoB) FROM TabellaA)
>
>ed avere un valore decimal come risultato...
Posta i comandi di CREATE TABLE, alcune righe di prova (INSERT INTO) ed il result set finale che vorresti ottenere con quei dati.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Ciunino Profilo | Newbie

Innanzitutto grazie per la pazienza!!!
ok... allora questa è la mia tabella:
/****** Object: Table [dbo].[Giocatori] Script Date: 03/11/2010 16:42:18 ******/
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[Giocatori]( [ID] [int] NOT NULL, [Giocatore] [varchar](50) NOT NULL, [Gruppo] [int] NOT NULL ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO

e un po' di righe...
INSERT INTO Giocatori (ID ,Giocatore ,Gruppo) VALUES (1,'gioc1',1) INSERT INTO Giocatori (ID ,Giocatore ,Gruppo) VALUES (2,'gioc2',1) INSERT INTO Giocatori (ID ,Giocatore ,Gruppo) VALUES (3,'gioc3',1) INSERT INTO Giocatori (ID ,Giocatore ,Gruppo) VALUES (4,'gioc4',2) INSERT INTO Giocatori (ID ,Giocatore ,Gruppo) VALUES (5,'gioc5',2) INSERT INTO Giocatori (ID ,Giocatore ,Gruppo) VALUES (6,'gioc6',2) INSERT INTO Giocatori (ID ,Giocatore ,Gruppo) VALUES (7,'gioc7',2)

la vista che vorrei ottenere è fatta in questo modo:
SELECT COUNT(ID) / (SELECT COUNT(ID) AS Expr1 FROM dbo.Giocatori) AS Result FROM dbo.Giocatori AS Giocatori_1 WHERE (Gruppo = 1)

in modo da ottenere quale è la percentuali di giocatori che appartengono al gruppo1.

Quindi, nel caso dell'esempio, un output del tipo
Result
42.86

Spero di essere stato chiaro

lbenaglia Profilo | Guru

>Spero di essere stato chiaro
Chiarissimo:

USE tempdb; CREATE TABLE dbo.Giocatori( ID int NOT NULL, Giocatore varchar(50) NOT NULL, Gruppo int NOT NULL ); INSERT dbo.Giocatori VALUES (1, 'gioc1', 1); INSERT dbo.Giocatori VALUES (2, 'gioc2', 1); INSERT dbo.Giocatori VALUES (3, 'gioc3', 1); INSERT dbo.Giocatori VALUES (4, 'gioc4', 2); INSERT dbo.Giocatori VALUES (5, 'gioc5', 2); INSERT dbo.Giocatori VALUES (6, 'gioc6', 2); INSERT dbo.Giocatori VALUES (7, 'gioc7', 2); SELECT CAST(COUNT(*) / (SELECT COUNT(*) * 1. FROM dbo.Giocatori) * 100 AS decimal(4,2)) AS Result FROM dbo.Giocatori WHERE Gruppo = 1; /* Output: Result -------- 42.86 (1 row(s) affected) */ DROP TABLE dbo.Giocatori;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Ciunino Profilo | Newbie

Ma Mitico!!!!

Non avevo provato questa soluzione!

Grazie mille per l'aiuto!!!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5