Variabili in SQL

mercoledì 24 ottobre 2007 - 11.36

secks Profilo | Senior Member

Lavoro con VB.NET 2003 e SQL 2000.
Ho la necessità di eseguire una query e poi trasformerò in sp con dei valori ricorsivi.

Provo a spiegarmi con un esempio:

SELECT Campo1 + 5 + 4 +6 AS Pippo, Campo1 + 5 + 4 +6 + Campo2 AS Pluto, Campo1 + 5 + 4 +6 + Campo3 AS Paperino FROM Tabella WHERE ...

è possibile fare in modo che Campo1 +5+4+6 sia posto in una variabile senza ripeterlo 3 volte?
Se si dove posso trovare qualche esempio?

Ciao a tutti e grazie.
Paolo.

lbenaglia Profilo | Guru

>Provo a spiegarmi con un esempio:
>
>SELECT Campo1 + 5 + 4 +6 AS Pippo, Campo1 + 5 + 4 +6 + Campo2
>AS Pluto, Campo1 + 5 + 4 +6 + Campo3 AS Paperino FROM Tabella
>WHERE ...
>
>è possibile fare in modo che Campo1 +5+4+6 sia posto in una variabile
>senza ripeterlo 3 volte?
>Se si dove posso trovare qualche esempio?

Ciao Paolo,

io non ho capito
Puoi postare un esempio completo con la struttura della tabella (CREATE TABLE), alcune righe di prova (INSERT INTO) ed il risultato che vorresti ottenere con quei dati?

>Ciao a tutti e grazie.
A te.

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

secks Profilo | Senior Member

L'esempio non c'è l'ho in quanto la query la sto facendo.

Provo ad essere + chiaro.

Ho una tabella formata dai seguenti campi:

Campo1, Campo2, Campo3

dovrei fare una estrazione dalla suddetta tabella con campi calcolati:

SELECT
Campo1 + 5 + 4 +6 AS Pippo,
Campo1 + 5 + 4 +6 + Campo2 AS Pluto,
Campo1 + 5 + 4 +6 + Campo3 AS Paperino
FROM Tabella
WHERE Campo3 = '100'

Siccome la prima colonna calcolata (Pippo) viene ripetuta sulle altre 2 (Pluto e Paperino) la mia domanda è se si puo evitare di ripetere Campo 1+5+4+6 per tutte le colonne.

... evitando di ripetere Campo1 + 5 + 4 + 6 e riutilizzando Pippo per le altre colonne calcolate.

Si puo fare una cosa come il seguente esempio?

@Pippo = Campo1 + 5 + 4 + 6

SELECT
@Pippo AS Pippo,
@Pippo + Campo2 AS Pluto,
@Pippo + Campo3 AS Paperino
FROM Tabella
WHERE Campo3='100'

Ciao e grazie.





lbenaglia Profilo | Guru

>dovrei fare una estrazione dalla suddetta tabella con campi calcolati:
>
>SELECT
>Campo1 + 5 + 4 +6 AS Pippo,
>Campo1 + 5 + 4 +6 + Campo2 AS Pluto,
>Campo1 + 5 + 4 +6 + Campo3 AS Paperino
>FROM Tabella
>WHERE Campo3 = '100'
>
>Siccome la prima colonna calcolata (Pippo) viene ripetuta sulle
>altre 2 (Pluto e Paperino) la mia domanda è se si puo evitare
>di ripetere Campo 1+5+4+6 per tutte le colonne.
>
>... evitando di ripetere Campo1 + 5 + 4 + 6 e riutilizzando Pippo
>per le altre colonne calcolate.
>
>Si puo fare una cosa come il seguente esempio?
>
>@Pippo = Campo1 + 5 + 4 + 6
>
>SELECT
>@Pippo AS Pippo,
>@Pippo + Campo2 AS Pluto,
>@Pippo + Campo3 AS Paperino
>FROM Tabella
>WHERE Campo3='100'
Così come hai scritto no, ma potresti utilizzare due query:

DELCLARE @Valore int; SELECT @Valore = Campo1 + 5 + 4 + 6 FROM Tabella WHERE Campo3 = 100; SELECT @Valore AS Pippo , @Valore + Campo2 AS Pluto , @Valore + Campo3 AS Paperino FROM Tabella WHERE Campo3 = 100;

Occhio che il data type delle colonne Campo1, 2 e 3 deve essere numerico!

>Ciao e grazie.
Prego.

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

secks Profilo | Senior Member

Ho fatto una prova:

Tabella:
1 campo0 nvarchar 2 1
0 campo1 decimal 9 1
0 campo2 decimal 9 1
0 campo3 decimal 9 1
0 campo4 decimal 9 1

Contenuto della tabella:


campo0 campo1 campo2 campo3 campo4
01 2 3 4 5
02 4 5 6 7
03 5 2 1 5
04 4 3 2 1
05 2 3 3 3
06 1 4 5 6
07 10 3 4 4

Eseguendo la seguente query in su Entreprise Manager

DELCLARE @Valore int
SELECT @Valore = Campo1 FROM WrkProva;
SELECT campo0, campo1, campo2, campo3, campo4, @Valore AS Pippo, @Valore + Campo2 AS Pluto, @Valore + Campo3 AS Paperino FROM WrkProva

Risultato:

campo0 campo1 campo2 campo3 campo4 Pippo Pluto Paperino
01 2 3 4 5 10 13 14
02 4 5 6 7 10 15 16
03 5 2 1 5 10 12 11
04 4 3 2 1 10 13 12
05 2 3 3 3 10 13 13
06 1 4 5 6 10 14 15
07 10 3 4 4 10 13 14

La cosa funzionerebbe a meraviglia se @Valore corrispondesse a campo1 del record corrispondente.
In questo modo @Valore corrisponde sempre a 10 (ultimo record).

Potrei ottenere il risultato sperato facendo 2 query, una con i valori calcolati, e mettendole in relazione tra loro.

Ci sono altri modi?

Ciao e grazie.
Paolo.

lbenaglia Profilo | Guru

>Potrei ottenere il risultato sperato facendo 2 query, una con
>i valori calcolati, e mettendole in relazione tra loro.

Potresti dire anche a noi qual è il risultato sperato dato che lo conosci solo tu?
Posta cortesemente i comandi DDL di CREATE TABLE ed INSERT INTO seguiti dal result set finale che vuoi ottenere.

>Ciao e grazie.
Prego.

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

secks Profilo | Senior Member

Ho allegato un file testo (prova.zip) con i comandi per
creare la tabella, alimentarla e la SELECT per per selezionare i dati.
Spero di aver dato il tutto in modo corretto, altrimenti dimmi come devo fare.


Risultato ottenuto:

campo0 campo1 campo2 campo3 campo4 Pippo Pluto Paperino
01 2 3 4 5 10 13 14
02 4 5 6 7 10 15 16
03 5 2 1 5 10 12 11
04 4 3 2 1 10 13 12
05 2 3 3 3 10 13 13
06 1 4 5 6 10 14 15
07 10 3 4 4 10 13 14

Risultato richiesto:

campo0 campo1 campo2 campo3 campo4 Pippo Pluto Paperino
01 2 3 4 5 2 5 6
02 4 5 6 7 4 9 10
03 5 2 1 5 5 7 6
04 4 3 2 1 4 7 6
05 2 3 3 3 2 5 5
06 1 4 5 6 1 5 6
07 10 3 4 4 10 13 14


Pippo Pluto e Paperino dovrebbero sommare campo1 del record corrispondente nella variabile Valore, invece Valore corrisponde a 10 fisso, record '07'

Ciao e grazie.
Paolo.

lbenaglia Profilo | Guru

>Ho allegato un file testo (prova.zip) con i comandi per
>creare la tabella, alimentarla e la SELECT per per selezionare
>i dati.
Perdonami ma lo zip contiene un db Access ed un progetto Visual Basic
Io ti ho chiesto i comandi DDL SQL per SQL Server che puoi generare da Enterprise Manager selezionando la tabella, tasto DX, Generate SQL Scripts...
Non dimenticare di postare anche i comandi di INSERT INTO per popolare la tabella.

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

secks Profilo | Senior Member

Acc. , ho sbagliato zip.

Ecco quello giusto.

secks Profilo | Senior Member

Ecco, scusa.

lbenaglia Profilo | Guru

>Ecco, scusa.

In base all'esempio che hai postato puoi ottenere il risultato sperato con questa query:

USE tempdb; GO CREATE TABLE dbo.WrkProva( campo0 char(2) NOT NULL PRIMARY KEY, campo1 int NOT NULL, campo2 int NOT NULL, campo3 int NOT NULL, campo4 int NOT NULL ); INSERT dbo.WrkProva VALUES ('01', 2, 3, 4, 5); INSERT dbo.WrkProva VALUES ('02', 4, 5, 6, 7); INSERT dbo.WrkProva VALUES ('03', 5, 2, 1, 5); INSERT dbo.WrkProva VALUES ('04', 4, 3, 2, 1); INSERT dbo.WrkProva VALUES ('05', 2, 3, 3, 3); INSERT dbo.WrkProva VALUES ('06', 1, 4, 5, 6); INSERT dbo.WrkProva VALUES ('07', 10, 3, 4, 4); SELECT * , campo1 AS Pippo , campo1 + campo2 AS Pluto , campo1 + campo3 AS Paperino FROM dbo.WrkProva; /* Output: campo0 campo1 campo2 campo3 campo4 Pippo Pluto Paperino ------ ------- ------- ------- ------- ------ ------ --------- 01 2 3 4 5 2 5 6 02 4 5 6 7 4 9 10 03 5 2 1 5 5 7 6 04 4 3 2 1 4 7 6 05 2 3 3 3 2 5 5 06 1 4 5 6 1 5 6 07 10 3 4 4 10 13 14 (7 row(s) affected) */ DROP TABLE dbo.WrkProva;

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

secks Profilo | Senior Member

Scusami, provo a spiegarmi su cio' che hai esposto e quello che vorrei ottenere:

partendo dalla seguendo query:
>
>SELECT
> *
> , campo1 AS Pippo
> , campo1 + campo2 AS Pluto
> , campo1 + campo3 AS Paperino
>FROM dbo.WrkProva;


dovrei fare la seguente:

SELECT
*
, campo1 + 5 AS Pippo
, campo1 + 5 + campo2 AS Pluto
, campo1 + 5 + campo3 AS Paperino
FROM dbo.WrkProva;

ed il risultato invece di essere

>campo0 campo1 campo2 campo3 campo4 Pippo Pluto Paperino
>------ ------- ------- ------- ------- ------ ------ ---------
>01 2 3 4 5 2 5 6
>02 4 5 6 7 4 9 10
>03 5 2 1 5 5 7 6
>04 4 3 2 1 4 7 6
>05 2 3 3 3 2 5 5
>06 1 4 5 6 1 5 6
>07 10 3 4 4 10 13 14

diventerebbe:

>campo0 campo1 campo2 campo3 campo4 Pippo Pluto Paperino
>------ ------- ------- ------- ------- ------ ------ ---------
>01 2 3 4 5 7 10 11
>02 4 5 6 7 9 14 15
>03 5 2 1 5 10 12 11
>04 4 3 2 1 9 12 11
>05 2 3 3 3 7 10 10
>06 1 4 5 6 6 10 11
>07 10 3 4 4 15 18 19

Tutto xchè ho creato la colonna calcolata 'campo1 + 5'.

La mia domanda era se come si potrebbe fare in modo di evitare di fare 'campo1 + 5' su tutte le altre colonne calcolate, che in caso di query + complesse diventa difficile da gestire e manutenere.

Io ho risolto facendo una sottoquery che ritorna campo1 + 5 e poi lo somma alle altre: del tipo:

SELECT *, WrkProva.campo2 + X.Tmp1 AS Pippo, WrkProva.campo3 + X.Tmp1 AS Pluto, WrkProva.campo4 + X.Tmp1 AS Paperino
FROM WrkProva LEFT OUTER JOIN
(SELECT campo0, campo1 + 5 AS Tmp1
FROM WrkProva) X ON WrkProva.campo0 = X.campo0

evitando così di ripetere campo1 + 5, che se fosse un campo calcolato tipo ad es. margine di vendta di un prodotto, ripeterlo per ogni colonna calcolata, sarebbe, a parer mio, dura, sopratutto per me che in VB e qualche variabile sono abituato a far tutto, ma ora che, per scelte aziendali, devo cercare di far fare il più possibile ad SQL, devo trovare altre soluzioni.

Alla fine mi chiedevo se ci possono essere altre soluzioni.

Ti ringrazio per la tua pazienza.

Ciao.
Paolo.

lbenaglia Profilo | Guru

>Alla fine mi chiedevo se ci possono essere altre soluzioni.
La soluzione più semplice ed efficiente è quella di ripetere Campo1 + 5.

>Ti ringrazio per la tua pazienza.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5