Numeri e somme

mercoledì 07 dicembre 2005 - 13.44

lordwaizard Profilo | Senior Member

Ho una tabella:
CREATE TABLE [dbo].[mag] (
[id] [int] NOT NULL ,
[codice] [nvarchar] (50) COLLATE Latin1_General_CI_AS NOT NULL ,
[qta] [int] NOT NULL ,
[app] [int] NOT NULL
) ON [PRIMARY]
GO

Ora mettiamo che ho un contenuto di questo genere:

CODICE QTA APP
X11 1 0
X11 3 3
X11 10 5

Consideriamo che arrivino 20 pezzi
Il calcolo che non so se posso fare con sql è il seguente

CODICE QTA APP QTA-APP
X11 1 0 1
X11 3 3 0
X11 10 5 5

Se la differenza tra qta e app risulta > 0, dovrei aggiornare la tabella scalando dai
20 pezzi iniziali la differenza e aggiungendoli per ogni riga alla voce app (appartati)
senza superare la voce qta.

In questo modo dovrei ottenere:
CODICE QTA APP
X11 1 1
X11 3 3
X11 10 10

E' possibile?
Davide

lbenaglia Profilo | Guru

> Consideriamo che arrivino 20 pezzi
> Il calcolo che non so se posso fare con sql è il seguente
>
> CODICE QTA APP QTA-APP
> X11 1 0 1
> X11 3 3 0
> X11 10 5 5

Ciao Davide,

SQL Server e' ingrado di eseguire calcoli sulle colonne numeriche, pertanto potresti eseguire una query come nel seguente esempio:

USE tempdb;
GO

/* Definisco la tabella dbo.mag */
CREATE TABLE dbo.mag(
[id] int NOT NULL,
codice nvarchar(50) NOT NULL,
qta int NOT NULL,
app int NOT NULL
);
GO

/* La popolo */
INSERT dbo.mag VALUES(1, 'X11', 1, 0);
INSERT dbo.mag VALUES(2, 'X11', 3, 3);
INSERT dbo.mag VALUES(3, 'X11', 10, 5);
GO

/* Query */
SELECT codice, qta, app, qta - app AS [qta - app]
FROM dbo.mag;
GO

/* Output:

codice qta app qta - app
------- ----------- ----------- -----------
X11 1 0 1
X11 3 3 0
X11 10 5 5

(3 row(s) affected)

*/


In alternativa puoi modificare la struttura della tabella aggiungendo una colonna calcolata:

/* Modifico la struttura della tabella dbo.mag */
ALTER TABLE dbo.mag
ADD [qta - app] AS qta - app;
GO

/* Vediamo */
SELECT *
FROM dbo.mag;
GO

/* Output:

id codice qta app qta - app
----------- ------- ----------- ----------- -----------
1 X11 1 0 1
2 X11 3 3 0
3 X11 10 5 5

(3 row(s) affected)

*/

Il valore della colonna [qta - app] verrà calcolato ogni qualvolta tale colonna verrà referenziata in una query.

SQL Server 2005 è in grado di salvare fisicamente il valore di una colonna calcolata nella tabella, aggiornandolo ogni volta che viene modificato il valore di qualsiasi altra colonna referenziata dalla colonna calcolata.
Questo permette di definire un indice deterministico sulla colonna calcolata, anche se non preciso.

/* Elimino la colonna calcolata */
ALTER TABLE dbo.mag
DROP COLUMN [qta - app];
GO

/* Rendo persistente la colonna calcolata */
ALTER TABLE dbo.mag
ADD [qta - app] AS qta - app PERSISTED;
GO

/* Vediamo */
SELECT *
FROM dbo.mag;
GO

/* Output:

id codice qta app qta - app
----------- ------- ----------- ----------- -----------
1 X11 1 0 1
2 X11 3 3 0
3 X11 10 5 5

(3 row(s) affected)

*/


> Se la differenza tra qta e app risulta > 0, dovrei aggiornare la tabella scalando dai
> 20 pezzi iniziali la differenza e aggiungendoli per ogni riga alla voce app (appartati)
> senza superare la voce qta.
>
> In questo modo dovrei ottenere:
> CODICE QTA APP
> X11 1 1
> X11 3 3
> X11 10 10
>
> E' possibile?

Mi dispiace ma qua non ti seguo.
Potresti preparare un esempio con tutto il codice SQL necessario per capire cosa vorresti fare?

Ciao!

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

lordwaizard Profilo | Senior Member

Ti ringrazio per la prima parte.
Seconda parte:
Allora considera la stessa tabella della prima parte popolate nel medesimo modo
CREATE TABLE dbo.mag(
[id] int NOT NULL,
codice nvarchar(50) NOT NULL,
qta int NOT NULL,
app int NOT NULL
);
GO

INSERT dbo.mag VALUES(1, 'X11', 1, 0);
INSERT dbo.mag VALUES(2, 'X11', 3, 3);
INSERT dbo.mag VALUES(3, 'X11', 10, 5);

Ora se osservi la prima riga vedi la differenza tra 1 e 0 è 1
Ora se osservi la seconda riga vedi la differenza tra 3 e 3 è 0
Ora se osservi la terza riga vedi la differenza tra 10 e 5 è 5

Considera che devo inserire 20 pezzi a magazzino.
Per appartare la merce dovrei verificare che le righe siano > 0 quindi
in questo caso la prima e la terza.
Una volta svolta questa operazione i pezzi si dovrebbero scalare e aggiungere alle colonne.

ES
20 pezzi in ingresso

1, 'X11', 1, 0 <-- app che è pari a 0 dovrebbe andare a 1 e i 20 pezzi iniziali a 19
2, 'X11', 3, 3 <-- non viene considerate perchè qta-imp = 0
3, 'X11', 10, 5<-- app che è pari a 5 dovrebbe andare a 10 e i 19 pezzi rimasti devo andare a 14

e via così fino arrivare o alla fine dei record oppure ad esaurire i pezzi iniziali.

RISULTATO FINALE
1, 'X11', 1, 1
2, 'X11', 3, 3
3, 'X11', 10, 10

Resto 14

Scusa se la prima volta non son stato chiaro
Grazie di tutto
Davide


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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5