Select irrisolta

lunedì 26 novembre 2007 - 00.30

lordjohn76 Profilo | Newbie

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.
Esempio

codice | Anno | NumeroMagazzino| qta
a10 1 1 1
a10 2 1 1
a10 3 1 1
a10 1 2 1
a10 2 2 1

Risultato:

a10 3 1 1
a10 2 2 1

Non sono una cima in SQL x questo vi chiedo aiutooooooo

alx_81 Profilo | Guru

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

lordjohn76 Profilo | Newbie

ti ringrazio x il consiglio, a dire il vero ci avevo pensato anche io
ma avevo usato male la clausola witn, in esecuzione mi diceva
che non potevo fare il join con la clausola ON su più di un campo,
poi ho riprovato dopo aver letto il tuo post ed ha funzionato.
Ancora Grazie!!
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5