Discussione:
Sommare un campo presente in due tabelle differenti
(troppo vecchio per rispondere)
Matteo Migliore
2004-05-31 20:14:59 UTC
Permalink
Ciao.

Come posso sommare un campo presente in due tabelle diverse
tramite questo statement:

Select SumField From Table1 Where ID=2
Union
Select SumField From Table2 Where ID=2

Quello che ottengo dallo statement ovviamente è:

Resultset:
SumField
-------------
10
20

Chiaramente ho semplificato, gentilmente quindi non prendete in
considerazioni
eventuali errori (anche logigi) frutto della "rimodellazione".

Posso risolvere con la funzione SUM?

Ad esempio:
Select Sum SumField From
Select SumField From Table1 Where ID=2
Union
Select SumField From Table2 Where ID=2

Grazie,
Matteo Migliore.

MSN - ***@email.it
Help in chat - soluzione su NG
Lorenzo Benaglia
2004-05-31 20:50:09 UTC
Permalink
Post by Matteo Migliore
Chiaramente ho semplificato, gentilmente quindi non prendete in
considerazioni
eventuali errori (anche logigi) frutto della "rimodellazione".
Posso risolvere con la funzione SUM?
Select Sum SumField From
Select SumField From Table1 Where ID=2
Union
Select SumField From Table2 Where ID=2
Ciao Matteo,

Il modo migliore per rispondere a questi quesiti è quello di "smanettare"
senza farsi troppi problemi.
Dai tuoi post mi sembra di capire che stai iniziando a muovere i primi passi
con SQL Server.
OK, allora installa una copia di MSDE (in modo da non avere problemi di
licensing) su un PC "sacrificabile", scarica DbaMgr2K di Andrea Montanari
(http://www.asql.biz/DbaMgr.shtm) ed inizia a prendere confidenza con il
Transact SQL sperimentando in tutta tranquillità.

La soluzione che proponi è logicamente corretta, ma sintatticamente errata.
Vediamo un esempio:

USE tempdb
GO

/* Definisco la tabella dbo.Table1 */
CREATE TABLE dbo.Table1(
[ID] int NOT NULL IDENTITY PRIMARY KEY,
SumField int NOT NULL
)
GO

/* Definisco la tabella dbo.Table2 */
CREATE TABLE dbo.Table2(
[ID] int NOT NULL IDENTITY PRIMARY KEY,
SumField int NOT NULL
)
GO

/* Le popolo */
SET NOCOUNT ON
INSERT dbo.Table1 VALUES(5)
INSERT dbo.Table1 VALUES(10)
INSERT dbo.Table1 VALUES(15)

INSERT dbo.Table2 VALUES(50)
INSERT dbo.Table2 VALUES(100)
SET NOCOUNT OFF
GO

/* Racchiudo la subquery tra parentesi tonde
** e le assegno un alias di tabella
*/
SELECT SUM(Q.SumField) AS Totale
FROM (
SELECT SumField
FROM dbo.Table1
WHERE [ID] = 2
UNION ALL
SELECT SumField
FROM dbo.Table2
WHERE [ID] = 2
) Q
GO

/* Output:

Totale
-----------
110

(1 row(s) affected)

*/

/* Pulizia */
DROP TABLE dbo.Table1, dbo.Table2

Aiutandoti con i Books Online sono sicuro che avresti trovato autonomamente
una soluzione analoga in soli 10 minuti...
Post by Matteo Migliore
Grazie,
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://mvp.support.microsoft.com
http://italy.mvps.org
Andrea Montanari
2004-05-31 20:55:51 UTC
Permalink
salve Matteo,
"Matteo Migliore"
Post by Matteo Migliore
Ciao.
Come posso sommare un campo presente in due tabelle diverse
Select SumField From Table1 Where ID=2
Union
Select SumField From Table2 Where ID=2
SumField
-------------
10
20
Chiaramente ho semplificato, gentilmente quindi non prendete in
considerazioni
eventuali errori (anche logigi) frutto della "rimodellazione".
Posso risolvere con la funzione SUM?
Select Sum SumField From
Select SumField From Table1 Where ID=2
Union
Select SumField From Table2 Where ID=2
se la granularita' del filtro e' cosi' alta da ritornare una ed una sola
riga per ogni tabella, puoi anche considerare qualche cosa simile a
SET NOCOUNT ON
CREATE TABLE dbo.t1 (
Id INT NOT NULL ,
Valore INT NOT NULL
)
GO
CREATE TABLE dbo.t2 (
Id INT NOT NULL ,
Valore INT NOT NULL
)
GO
INSERT INTO dbo.t1 VALUES ( 1 , 5 )
INSERT INTO dbo.t1 VALUES ( 2 , 10 )
INSERT INTO dbo.t1 VALUES ( 3 , 15 )

INSERT INTO dbo.t2 VALUES ( 1 , 5 )
INSERT INTO dbo.t2 VALUES ( 2 , 10 )
INSERT INTO dbo.t2 VALUES ( 3 , 15 )

SELECT t1.Valore + t2.Valore AS [Risultato]
FROM dbo.t1 t1 , dbo.t2 t2
WHERE t1.Id=2 AND t2.Id = 3
GO
DROP TABLE dbo.t1
DROP TABLE dbo.t2
--<-------------
Risultato
-----------
25

attento pero' ai cross join...
saluti
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz/DbaMgr.shtm http://italy.mvps.org
DbaMgr2k ver 0.7.0 - DbaMgr ver 0.53.0
(my vb6+sql-dmo little try to provide MS MSDE 1.0 and MSDE 2000 a visual
interface)
--------- remove DMO to reply
Matteo Migliore
2004-05-31 21:06:49 UTC
Permalink
Ciao Andrea.

La situazione è un po' complessa.
La query è dinamica (so che sono sconsigliate) ma al momento devo
utilizzarle.

Non posso quindi applicare la soluzione che proponi.

Quello di cui necessito è proprio la somma come l'ho
definita nello statement, per motivi progettuali non posso avere le diverse
tabelle nello stesso statement "select".

Come potrei fare?

Grazie,
Matteo Migliore.
Post by Andrea Montanari
salve Matteo,
"Matteo Migliore"
Post by Matteo Migliore
Ciao.
Come posso sommare un campo presente in due tabelle diverse
Select SumField From Table1 Where ID=2
Union
Select SumField From Table2 Where ID=2
SumField
-------------
10
20
Chiaramente ho semplificato, gentilmente quindi non prendete in
considerazioni
eventuali errori (anche logigi) frutto della "rimodellazione".
Posso risolvere con la funzione SUM?
Select Sum SumField From
Select SumField From Table1 Where ID=2
Union
Select SumField From Table2 Where ID=2
se la granularita' del filtro e' cosi' alta da ritornare una ed una sola
riga per ogni tabella, puoi anche considerare qualche cosa simile a
SET NOCOUNT ON
CREATE TABLE dbo.t1 (
Id INT NOT NULL ,
Valore INT NOT NULL
)
GO
CREATE TABLE dbo.t2 (
Id INT NOT NULL ,
Valore INT NOT NULL
)
GO
INSERT INTO dbo.t1 VALUES ( 1 , 5 )
INSERT INTO dbo.t1 VALUES ( 2 , 10 )
INSERT INTO dbo.t1 VALUES ( 3 , 15 )
INSERT INTO dbo.t2 VALUES ( 1 , 5 )
INSERT INTO dbo.t2 VALUES ( 2 , 10 )
INSERT INTO dbo.t2 VALUES ( 3 , 15 )
SELECT t1.Valore + t2.Valore AS [Risultato]
FROM dbo.t1 t1 , dbo.t2 t2
WHERE t1.Id=2 AND t2.Id = 3
GO
DROP TABLE dbo.t1
DROP TABLE dbo.t2
--<-------------
Risultato
-----------
25
attento pero' ai cross join...
saluti
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz/DbaMgr.shtm http://italy.mvps.org
DbaMgr2k ver 0.7.0 - DbaMgr ver 0.53.0
(my vb6+sql-dmo little try to provide MS MSDE 1.0 and MSDE 2000 a visual
interface)
--------- remove DMO to reply
Andrea Montanari
2004-05-31 21:17:32 UTC
Permalink
salve Matteo,
"Matteo Migliore"
Post by Matteo Migliore
Ciao Andrea.
La situazione è un po' complessa.
La query è dinamica (so che sono sconsigliate) ma al momento devo
utilizzarle.
Non posso quindi applicare la soluzione che proponi.
Quello di cui necessito è proprio la somma come l'ho
definita nello statement, per motivi progettuali non posso avere le diverse
tabelle nello stesso statement "select".
Come potrei fare?
se devi per forza passare per una Union allora sicuramente avrai 2 e non una
riga...
a questo punto potresti passare per una tabella temporanea e farne il
SUM(..)
tipo
SET NOCOUNT ON
DECLARE @t TABLE (Valore INT)
INSERT INTO @t SELECT ... FROM ... WHERE colonna = x UNION SELECT ... FROM
... WHERE colonna = y

SELECT SUM(Valore) FROM @t --- che sara' il vero risultato da ritornare...

dove manitieni la tua UNION e carichi una variabile tabella...
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz/DbaMgr.shtm http://italy.mvps.org
DbaMgr2k ver 0.7.0 - DbaMgr ver 0.53.0
(my vb6+sql-dmo little try to provide MS MSDE 1.0 and MSDE 2000 a visual
interface)
--------- remove DMO to reply
Matteo Migliore
2004-06-01 13:39:55 UTC
Permalink
Grazie Andrea, proprio quello che mi serviva.

Ultima cosa: se volessi ottenere la concatenazione di tutti i valori che
in quest'altro caso sono tutti stringhe, come potrei riscrivere lo
statement?

Necessito di una funzione che produca un risultato simile a SUM, ma con le
stringhe.

Grazie,
Matteo Migliore.
Post by Andrea Montanari
salve Matteo,
"Matteo Migliore"
Post by Matteo Migliore
Ciao Andrea.
La situazione è un po' complessa.
La query è dinamica (so che sono sconsigliate) ma al momento devo
utilizzarle.
Non posso quindi applicare la soluzione che proponi.
Quello di cui necessito è proprio la somma come l'ho
definita nello statement, per motivi progettuali non posso avere le
diverse
Post by Matteo Migliore
tabelle nello stesso statement "select".
Come potrei fare?
se devi per forza passare per una Union allora sicuramente avrai 2 e non una
riga...
a questo punto potresti passare per una tabella temporanea e farne il
SUM(..)
tipo
SET NOCOUNT ON
... WHERE colonna = y
dove manitieni la tua UNION e carichi una variabile tabella...
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz/DbaMgr.shtm http://italy.mvps.org
DbaMgr2k ver 0.7.0 - DbaMgr ver 0.53.0
(my vb6+sql-dmo little try to provide MS MSDE 1.0 and MSDE 2000 a visual
interface)
--------- remove DMO to reply
Lorenzo Benaglia
2004-06-01 13:46:08 UTC
Permalink
Post by Matteo Migliore
Necessito di una funzione che produca un risultato simile a SUM, ma
con le stringhe.
Ciao Matteo,

effettua un cast esplicito ad int ed applica la funzione di aggregazione
SUM.
Per maggiori info leggi il paragrafo "CAST and CONVERT"
URL:tsqlref.chm::/ts_ca-co_2f3o.htm sui Books online.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://mvp.support.microsoft.com
http://italy.mvps.org
Andrea Montanari
2004-06-01 15:05:11 UTC
Permalink
salve Matteo,
"Matteo Migliore"
Post by Matteo Migliore
Grazie Andrea, proprio quello che mi serviva.
Ultima cosa: se volessi ottenere la concatenazione di tutti i valori che
in quest'altro caso sono tutti stringhe, come potrei riscrivere lo
statement?
Necessito di una funzione che produca un risultato simile a SUM, ma con le
stringhe.
chiaramente non puoi avere un'aggregazione di stringhe [sommare mele + pere
=;-D ] , ma la mera concatenazione delle stesse, similarmente a
SET NOCOUNT ON
DECLARE @out VARCHAR(8000) ;
DECLARE @t TABLE (strvar VARCHAR(20)) ;

INSERT INTO @t SELECT 'Andrea Montanari' UNION SELECT 'Lorenzo Benaglia' ;

SET @out ='' ;
SELECT @out = @out + CASE WHEN DATALENGTH (@out)=0 THEN '' ELSE ', ' END +
t.strvar
FROM @t t ;

SELECT @out AS [Risultato];
--<---------
Risultato
-----------------------------------
Andrea Montanari, Lorenzo Benaglia

saluti
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz/DbaMgr.shtm http://italy.mvps.org
DbaMgr2k ver 0.7.0 - DbaMgr ver 0.53.0
(my vb6+sql-dmo little try to provide MS MSDE 1.0 and MSDE 2000 a visual
interface)
--------- remove DMO to reply
Matteo Migliore
2004-06-01 15:57:59 UTC
Permalink
Perfetto, grazie.

MVP mica per niente :-)

Matteo Migliore.
Post by Andrea Montanari
salve Matteo,
"Matteo Migliore"
Post by Matteo Migliore
Grazie Andrea, proprio quello che mi serviva.
Ultima cosa: se volessi ottenere la concatenazione di tutti i valori che
in quest'altro caso sono tutti stringhe, come potrei riscrivere lo
statement?
Necessito di una funzione che produca un risultato simile a SUM, ma con le
stringhe.
chiaramente non puoi avere un'aggregazione di stringhe [sommare mele + pere
=;-D ] , ma la mera concatenazione delle stesse, similarmente a
SET NOCOUNT ON
t.strvar
--<---------
Risultato
-----------------------------------
Andrea Montanari, Lorenzo Benaglia
saluti
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz/DbaMgr.shtm http://italy.mvps.org
DbaMgr2k ver 0.7.0 - DbaMgr ver 0.53.0
(my vb6+sql-dmo little try to provide MS MSDE 1.0 and MSDE 2000 a visual
interface)
--------- remove DMO to reply
Continua a leggere su narkive:
Loading...