Discussione:
funzione di arrotondamento di T-sql
(troppo vecchio per rispondere)
sandro
2005-01-07 14:57:02 UTC
Permalink
Buongiorno,

sto creando una stored procedure con campi calcolati
ho visto che posso utilizzare la funzione round in questo modo :

ROUND(748.58, -1)
ROUND(748.58, -2)
ROUND(748.58, -3)

però io avrei bisogno di ottente il prodotto di due campi arrotondato per
eccesso e successivamente moltiplicarlo per un altro campo :

round(dbo.T_raccordo_Fcarico_unione.quantità *
dbo.T_DB_unione.coefficiente1,1) * dbo.T_DB_unione.valore

ottengo un errore negli argomenti della funzione.
Non vorrei a questo punto che la round si potesse utilizzare solo con numeri.

Se così fosse come posso ottenre l'arrotondamento per eccesso con campi
calcolati in una sp di un progetto di access ??
con gli mdb basta una funzione personalizzata in vba., ma con i progetti
questa non è utilizzabile.

Mi date una mano ?
Andrea Montanari
2005-01-07 15:24:12 UTC
Permalink
salve Sandor,
Post by sandro
Buongiorno,
sto creando una stored procedure con campi calcolati
ROUND(748.58, -1)
ROUND(748.58, -2)
ROUND(748.58, -3)
però io avrei bisogno di ottente il prodotto di due campi arrotondato
round(dbo.T_raccordo_Fcarico_unione.quantità *
dbo.T_DB_unione.coefficiente1,1) * dbo.T_DB_unione.valore
ottengo un errore negli argomenti della funzione.
Non vorrei a questo punto che la round si potesse utilizzare solo con numeri.
Se così fosse come posso ottenre l'arrotondamento per eccesso con
campi calcolati in una sp di un progetto di access ??
con gli mdb basta una funzione personalizzata in vba., ma con i
progetti questa non è utilizzabile.
Mi date una mano ?
se ho capito la tua necessita', a me funziona (direi) correttamente...
SET NOCOUNT ON
USE tempdb
DECLARE @n1 DECIMAL (10,5), @n2 INT
SELECT @n1 = 748.58 , @n2 = 7

SELECT ROUND ( @n1 , 1) * @n2 , @n1 * @n2

CREATE TABLE dbo.Calc (
ID INT NOT NULL ,
n1 DECIMAL (10,5) ,
n2 INT ,
nCalc AS ROUND ( n1 , 1) * n2
)

INSERT INTO dbo.Calc VALUES ( 1 ,748.58 , 7 )
SELECT * FROM dbo.Calc
DROP TABLE dbo.Calc
--<-----------------

----------------------- -----------------------
5240.20000 5240.06000

ID n1 n2 nCalc
----------- ------------ ----------- -----------------------
1 748.58000 7 5240.20000

saluti
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz/DbaMgr.shtm http://italy.mvps.org
DbaMgr2k ver 0.9.1 - DbaMgr ver 0.55.1
(my vb6+sql-dmo little try to provide MS MSDE 1.0 and MSDE 2000 a visual
interface)
--------- remove DMO to reply
Andrea Montanari
2005-01-07 15:32:38 UTC
Permalink
scusa..
"Andrea Montanari" <***@virgilio.it> ha scritto nel messaggio news:***@individual.net

SET NOCOUNT ON
USE tempdb
DECLARE @n1 DECIMAL (10,5), @n2 DECIMAL (10,5), @n3 INT
SELECT @n1 = 748.58 , @n2 = 874.858 , @n3 = 7

SELECT ROUND ( @n1 * @n2, 1) * @n3 , (@n1 * @n2) * @n3

CREATE TABLE dbo.Calc (
ID INT NOT NULL ,
n1 DECIMAL (10,5) ,
n2 DECIMAL (10,5) ,
n3 INT ,
nCalc AS ROUND ( n1 * n2, 1) * n3
)

INSERT INTO dbo.Calc VALUES ( 1 ,748.58 , 874.858, 7 )
SELECT * FROM dbo.Calc
DROP TABLE dbo.Calc
---<-------------

---------------------------------- ----------------------------------
4584308.4000000000 4584308.4114800000

ID n1 n2 n3 nCalc
----------- ------------ ------------ ----------- --------------------------
--------
1 748.58000 874.85800 7 4584308.4000000000
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz/DbaMgr.shtm http://italy.mvps.org
DbaMgr2k ver 0.9.1 - DbaMgr ver 0.55.1
(my vb6+sql-dmo little try to provide MS MSDE 1.0 and MSDE 2000 a visual
interface)
--------- remove DMO to reply
giorgio rancati
2005-01-07 15:40:59 UTC
Permalink
Post by sandro
Buongiorno,
sto creando una stored procedure con campi calcolati
ROUND(748.58, -1)
ROUND(748.58, -2)
ROUND(748.58, -3)
però io avrei bisogno di ottente il prodotto di due campi arrotondato per
round(dbo.T_raccordo_Fcarico_unione.quantità *
dbo.T_DB_unione.coefficiente1,1) * dbo.T_DB_unione.valore
ottengo un errore negli argomenti della funzione.
Non vorrei a questo punto che la round si potesse utilizzare solo con numeri.
Se così fosse come posso ottenre l'arrotondamento per eccesso con campi
calcolati in una sp di un progetto di access ??
con gli mdb basta una funzione personalizzata in vba., ma con i progetti
questa non è utilizzabile.
Mi date una mano ?
Ciao Sandro,

controlla bene perchè il problema è altrove, la funzione così come la mostri
non ha nessun problema, certo bisognerebbe vedere la select per intero.

per toglierti il dubbio sulla funzione round prova questo esempio
---------------------
Create Table #Tb
(C1 numeric(18,2),
C2 numeric(18,2),
C3 numeric(18,2))

INSERT #Tb
Values(10.2,18.55,2)


SELECT ROUND(C1*C2,1)*C3
FROM #Tb

Drop Table #Tb
---------------------------

Risutato

----------------------------------------
378.400000

(righe interessate: 1)


Ciao Giorgio
sandro
2005-01-07 16:55:05 UTC
Permalink
[cut]
Gentilissimi Giorgio ed Andrea,
vi ringrazio innanzi tutto per la risposta così’ rapida.
Il mio problema è che sono proprio all’inizio con le sp e purtroppo le mie
competenze attuali non mi consentono di mettere in pratica quanto da voi
suggerito, né di vedenre il funzionamento.
Mi dispiace.
Comunque nel caso voleste continuare a “formarmi” vi do qualche ulteriore
informazione.
La mia sp e al livello progettazione e non al livello do editor di testo ed
è fatta da 6 tabelle 2 due queries. La parte della select è questa :

SELECT dbo.T_fatture_carico_unione.id_data_fattura,
dbo.T_fatture_carico_unione.numero_fattura,
dbo.T_fatture_carico_unione.data_fattura,
dbo.T_famiglia_unione.famiglie,
dbo.T_componente_unione.componente,
dbo.Qv_tot_qta_fam.qtafam *
dbo.T_DB_unione.coefficiente1 * dbo.T_DB_unione.valore AS vtotale,
dbo.Qv_tot_qta_fam.qtafam *
dbo.T_DB_unione.coefficiente1 AS impiego, dbo.Qv_tot_qta_fam.qtafam *
dbo.T_DB_unione.peso AS ptotale,
dbo.Qv_tot_qta_fam.qtafam, dbo.T_DB_unione.valore,
dbo.T_componente_unione.Voce_Doganale,
dbo.T_componente_unione.unità_di_misura,
dbo.T_fatture_carico_unione.n_dei_bancali,
dbo.T_fatture_carico_unione.Mezzo_di_trasporto,
dbo.Qv_totale_pezzi_fattura.totalepezzifattura,
dbo.T_DB_unione.sequenza

in pratica ho provato così
round (dbo.T_famiglia_unione.famiglie, dbo.T_componente_unione.componente,
dbo.Qv_tot_qta_fam.qtafam *
dbo.T_DB_unione.coefficiente1 ,1)* dbo.T_DB_unione.valore AS vtotale,

ma non va. Non è il massimo della figura, ma se avete voglia di darmi una
mano sono qui che aspetto.
Vi ringrazio e saluto
Andrea Montanari
2005-01-07 17:16:52 UTC
Permalink
salve Sandro,
Post by sandro
in pratica ho provato così
round (dbo.T_famiglia_unione.famiglie,
dbo.T_componente_unione.componente,
dbo.Qv_tot_qta_fam.qtafam *
dbo.T_DB_unione.coefficiente1 ,1)* dbo.T_DB_unione.valore AS vtotale,
ROUND (...) accetta massimo 3 parametri, come gia' sicuramente hai visto
presso
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ra-rz_93z8.asp,
per cui mi pare ce ne siano troppi in quelli riportati...

dove la vuoi mettere la funzione?

round ( dbo.Qv_tot_qta_fam.qtafam * dbo.T_DB_unione.coefficiente1 ,1)*
dbo.T_DB_unione.valore AS vtotale ?
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz/DbaMgr.shtm http://italy.mvps.org
DbaMgr2k ver 0.9.1 - DbaMgr ver 0.55.1
(my vb6+sql-dmo little try to provide MS MSDE 1.0 and MSDE 2000 a visual
interface)
--------- remove DMO to reply
sandro
2005-01-07 17:27:04 UTC
Permalink
[cut]

ciao Andrea
Post by Andrea Montanari
ROUND (...) accetta massimo 3 parametri, come gia' sicuramente hai visto
presso
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ra-rz_93z8.asp,
per cui mi pare ce ne siano troppi in quelli riportati...
Si, ho scaricato l'intera documentazione di sql serever 2000, ma non è bastato
Post by Andrea Montanari
dove la vuoi mettere la funzione?
round ( dbo.Qv_tot_qta_fam.qtafam * dbo.T_DB_unione.coefficiente1 ,1)*
dbo.T_DB_unione.valore AS vtotale ?
esatto e anche qui :

dbo.Qv_tot_qta_fam.qtafam * dbo.T_DB_unione.coefficiente1

Grazie ancora.
Andrea Montanari
2005-01-07 17:34:33 UTC
Permalink
Post by sandro
Post by Andrea Montanari
dove la vuoi mettere la funzione?
round ( dbo.Qv_tot_qta_fam.qtafam * dbo.T_DB_unione.coefficiente1
,1)* dbo.T_DB_unione.valore AS vtotale ?
dbo.Qv_tot_qta_fam.qtafam * dbo.T_DB_unione.coefficiente1
Grazie ancora.
ma e' la stessa... o devi anche aggiungerne un altro senza la
moltiplicazione per dbo.T_DB_unione.valore ?
non capisco
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz/DbaMgr.shtm http://italy.mvps.org
DbaMgr2k ver 0.9.1 - DbaMgr ver 0.55.1
(my vb6+sql-dmo little try to provide MS MSDE 1.0 and MSDE 2000 a visual
interface)
--------- remove DMO to reply
sandro
2005-01-07 17:41:05 UTC
Permalink
Post by Andrea Montanari
Post by sandro
Post by Andrea Montanari
dove la vuoi mettere la funzione?
round ( dbo.Qv_tot_qta_fam.qtafam * dbo.T_DB_unione.coefficiente1
,1)* dbo.T_DB_unione.valore AS vtotale ?
dbo.Qv_tot_qta_fam.qtafam * dbo.T_DB_unione.coefficiente1
Grazie ancora.
ma e' la stessa... o devi anche aggiungerne un altro senza la
moltiplicazione per dbo.T_DB_unione.valore ?
non capisco
No, hai capito bene, :

sia qua :

dbo.Qv_tot_qta_fam.qtafam * dbo.T_DB_unione.coefficiente1 *
dbo.T_DB_unione.valore

che qua :

dbo.Qv_tot_qta_fam.qtafam * dbo.T_DB_unione.coefficiente1

ho questi due campi calcolati da arrotondare.
Andrea Montanari
2005-01-07 18:11:02 UTC
Permalink
...........
dbo.Qv_tot_qta_fam.qtafam * dbo.T_DB_unione.coefficiente1 *
dbo.T_DB_unione.valore
dbo.Qv_tot_qta_fam.qtafam * dbo.T_DB_unione.coefficiente1
ho questi due campi calcolati da arrotondare.
allora ripeti la funzione di arrotondamento, passando come parametro la
moltiplicazione delle colonne che a te interessano.. scusa, ma continuo a
non vedere il problema o a non capire
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz/DbaMgr.shtm http://italy.mvps.org
DbaMgr2k ver 0.9.1 - DbaMgr ver 0.55.1
(my vb6+sql-dmo little try to provide MS MSDE 1.0 and MSDE 2000 a visual
interface)
--------- remove DMO to reply
sandro
2005-01-07 18:49:04 UTC
Permalink
[cut]
Post by Andrea Montanari
allora ripeti la funzione di arrotondamento, passando come parametro la
moltiplicazione delle colonne che a te interessano.. scusa, ma continuo a
non vedere il problema o a non capire
Ma nooo, sai perchè continuavo a sbagliare ?
Perche l'istruzione corretta per me era con la virgola, invece nella colonna
bisogna scriverla con il ; che in t-sql viene tradotta come ,

bisogna scrivere questo :
ROUND(dbo.Qv_tot_qta_fam.qtafam * dbo.T_DB_unione.coefficiente1; 0) *
dbo.T_DB_unione.valore

e si ottiene questo :
ROUND(dbo.Qv_tot_qta_fam.qtafam * dbo.T_DB_unione.coefficiente1, 0)
* dbo.T_DB_unione.valore AS vtotale

ho visto che funziona meglio dell'istruzione round degli mdb, questa è
precisa.
Ma se non postavo non ci sarei arrivato perchè non sapevo se la strada era
giusta.
Grazie.
Ultima cortesia please :
Per ottenere in t-sql l'equivalente della funzione nz come posso procedere ?
Ho bisogno cioè che quando il campo in una select è null mi restituisca zero,
Negli esempi riportati sul mio libro di testo non c'è nulla !
Andrea Montanari
2005-01-07 19:48:39 UTC
Permalink
Post by sandro
Per ottenere in t-sql l'equivalente della funzione nz come posso
procedere ? Ho bisogno cioè che quando il campo in una select è null
mi restituisca zero, Negli esempi riportati sul mio libro di testo
non c'è nulla !
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ia-iz_6mek.asp
oppure
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ca-co_9dph.asp
saluti
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz/DbaMgr.shtm http://italy.mvps.org
DbaMgr2k ver 0.9.1 - DbaMgr ver 0.55.1
(my vb6+sql-dmo little try to provide MS MSDE 1.0 and MSDE 2000 a visual
interface)
--------- remove DMO to reply
sandro
2005-01-07 20:23:11 UTC
Permalink
[cut]

Sei stato gentilissimo, grazie 1k!
Ciao.

Loading...