Ciao!
>Ho una tabella di articoli di magazzino composta da deiverse
>colonne tra cui:
>
>CodiceArticolo, Anno, NumeroMagazzino, qta,...ecc.
>
>partendo dal solo codice articolo come parametro in imput
>devo recuperare con una select le info di tale articolo per ogni
>magazzino dove l'anno è il massimo x tale magazzino.
Ovviamente il valore massino dell'anno non è uguale x tutti i magazzini.
Prima domanda, che DBMS utilizzi?
Qui di seguito ti allego un esempio in SQL Server 2005. Il tuo problema sta nel fatto che mentre le informazioni, chiamiamole di chiave, come Il CodiceArticolo, il NumeroMagazzino e l'Anno, possono essere raggruppate per ottenere il risultato che ti serve, le informazioni di contorno no. Quindi sei costretto a scrivere una subquery. Questo perchè le info di contorno (come la quantità) possono cambiare e quindi non risulta utile raggruppare l'intero record per ottenere ciò che ti serve. Eccoti l'esempio (uso il costrutto WITH: http://msdn2.microsoft.com/en-us/library/ms190766.aspx):
USE tempdb
GO
-- creo la tabella di appoggio sul tempdb
CREATE TABLE dbo.Articoli
(
CodiceArticolo CHAR(5) NOT NULL
, Anno smallint NOT NULL
, NumeroMagazzino smallint NOT NULL
, Qta smallint NOT NULL
, CONSTRAINT PK_Articoli PRIMARY KEY CLUSTERED
(
CodiceArticolo
, Anno
, NumeroMagazzino
)
)
GO
-- popolo la tabella
INSERT INTO dbo.Articoli (CodiceArticolo, Anno, NumeroMagazzino, Qta)
VALUES ('ART01', 2000, 1, 1)
INSERT INTO dbo.Articoli (CodiceArticolo, Anno, NumeroMagazzino, Qta)
VALUES ('ART01', 2001, 1, 3)
INSERT INTO dbo.Articoli (CodiceArticolo, Anno, NumeroMagazzino, Qta)
VALUES ('ART01', 2003, 1, 4)
INSERT INTO dbo.Articoli (CodiceArticolo, Anno, NumeroMagazzino, Qta)
VALUES ('ART01', 2000, 2, 5)
INSERT INTO dbo.Articoli (CodiceArticolo, Anno, NumeroMagazzino, Qta)
VALUES ('ART01', 2001, 2, 1)
INSERT INTO dbo.Articoli (CodiceArticolo, Anno, NumeroMagazzino, Qta)
VALUES ('ART01', 2000, 3, 3)
INSERT INTO dbo.Articoli (CodiceArticolo, Anno, NumeroMagazzino, Qta)
VALUES ('ART01', 2002, 3, 2)
INSERT INTO dbo.Articoli (CodiceArticolo, Anno, NumeroMagazzino, Qta)
VALUES ('ART02', 2000, 1, 5)
INSERT INTO dbo.Articoli (CodiceArticolo, Anno, NumeroMagazzino, Qta)
VALUES ('ART02', 2001, 1, 1)
INSERT INTO dbo.Articoli (CodiceArticolo, Anno, NumeroMagazzino, Qta)
VALUES ('ART02', 2002, 1, 1)
INSERT INTO dbo.Articoli (CodiceArticolo, Anno, NumeroMagazzino, Qta)
VALUES ('ART02', 2003, 1, 1)
INSERT INTO dbo.Articoli (CodiceArticolo, Anno, NumeroMagazzino, Qta)
VALUES ('ART02', 2002, 3, 1)
INSERT INTO dbo.Articoli (CodiceArticolo, Anno, NumeroMagazzino, Qta)
VALUES ('ART02', 2000, 3, 5)
INSERT INTO dbo.Articoli (CodiceArticolo, Anno, NumeroMagazzino, Qta)
VALUES ('ART03', 2000, 1, 1)
INSERT INTO dbo.Articoli (CodiceArticolo, Anno, NumeroMagazzino, Qta)
VALUES ('ART04', 2000, 1, 1)
GO
-- sottoquery che contiene il massimo anno per ogni magazzino a parità di articolo
;WITH ChiaveMaxArticolo AS
(
SELECT
CodiceArticolo
, AnnoMAX = MAX(Anno)
, NumeroMagazzino
FROM
dbo.Articoli
GROUP BY
CodiceArticolo
, NumeroMagazzino
)
-- ecco la query finale per il risultato
SELECT
A.*
FROM
ChiaveMaxArticolo M
JOIN dbo.Articoli A ON A.CodiceArticolo = M.CodiceArticolo AND
A.Anno = M.AnnoMAX AND
A.NumeroMagazzino = M.NumeroMagazzino
WHERE A.CodiceArticolo = 'ART01'
ORDER BY
A.CodiceArticolo
, A.NumeroMagazzino
, A.Anno
-- pulizia
DROP TABLE dbo.Articoli
GO
Come vedi, ottengo quello che ti serve in una fase intermedia (la with), per poi eseguire una self join.
Quello che faccio con la with (nel caso in cui non usassi SQL Server 2005) può essere convertito in una subquery scritta in line.
Facci sapere che DBMS utilizzi.
Ciao!
Alx81 =)
http://blogs.dotnethell.it/suxstellino