Select su viste con campi duplicati

giovedì 16 aprile 2009 - 17.18

Pongo Profilo | Senior Member

Il titolo non c'entra molto ma non so nemmeno quale sia il mio problema.

La faccio breve ho due viste: negozio, codice, venduto in gennaio e negozio, codice , venduto in febbraio.

Come faccio ad avere negozio, codice, venduto in gennaio, venduto in febbraio?

Mettendo in join le due viste devo fare una full outer in modo da non perder gli articoli che sono venduti O a gennaio O a febbraio. Devo purtroppo replicare il negozio e il codice onde evitare di avere righe con solo un numero.

MI trovo quindi nella situazione: (metto V1 per vista 1 e V2 pe rvista 2)
NegV1 NegV2 CodV1 conV2 VendGenn VendFebb
000 NULL 123 NULL 1 NULL
NULL 000 NULL 045 NULL 5
000 000 789 789 8 4


La prima riga ha un articolo venduto solo a gennaio, la seconda uno venduto solo a febbraio e la terza uno venduto sia a gennaio che a febbraio.

Se prendessi il negozio, codice solo dalla prima tabella, nella seconda riga mi troverei solo tanti NULL e un 5 senza sapere a che codice appartiene.

Non so se so capisce molto, spero di sì!!

Ecco non so come fare ad avere Negozio, codice, venduto genn, venduto febb.

Avevo pensato ad uno script destination ma mi vien da piangere a processare cella per cella. tenete conto che avrò 8 viste cos' strutturate da mettere in join.

Aiuto!!!

EDIT: Forse con una union?

alx_81 Profilo | Guru

>Come faccio ad avere negozio, codice, venduto in gennaio, venduto
>in febbraio?
>Mettendo in join le due viste devo fare una full outer in modo
>da non perder gli articoli che sono venduti O a gennaio O a febbraio.
>Devo purtroppo replicare il negozio e il codice onde evitare
>di avere righe con solo un numero.

>EDIT: Forse con una union?
no, una union va in verticale..
invece sarebbe meglio prendere la tua tabella dei "negozi" (di cui non so il nome, sperando che esista ) e metterla in left join prima con una vista e poi con l'altra.
L'importante è avere la "parte di sinistra" con tutti i negozi.
Osserva il seguente esempio:

USE tempdb; GO CREATE TABLE dbo.Negozi ( IDNegozio int NOT NULL , Nome varchar(50) NOT NULL , CONSTRAINT PK_dboNegozi PRIMARY KEY CLUSTERED ( IDNegozio ) ) GO INSERT INTO dbo.Negozi (IDNegozio, Nome) VALUES (1, 'Negozio uno') INSERT INTO dbo.Negozi (IDNegozio, Nome) VALUES (2, 'Negozio due') INSERT INTO dbo.Negozi (IDNegozio, Nome) VALUES (3, 'Negozio tre') INSERT INTO dbo.Negozi (IDNegozio, Nome) VALUES (4, 'Negozio quattro') GO -- creo due tabelle facendo finta che siano le tue viste CREATE TABLE dbo.VistaGennaio ( IDNegozio int NOT NULL , Mese tinyint NOT NULL , Venduto decimal(10,2) NOT NULL , CONSTRAINT PK_dboVistaGennaio PRIMARY KEY CLUSTERED ( IDNegozio ) ) GO CREATE TABLE dbo.VistaFebbraio ( IDNegozio int NOT NULL , Mese tinyint NOT NULL , Venduto decimal(10,2) NOT NULL , CONSTRAINT PK_dboVistaFebbraio PRIMARY KEY CLUSTERED ( IDNegozio ) ) GO -- inserisco i valori di prova INSERT INTO dbo.VistaGennaio (IDNegozio, Mese, Venduto) VALUES (3, 1, 1005.4) INSERT INTO dbo.VistaGennaio (IDNegozio, Mese, Venduto) VALUES (4, 1, 2500.45) -- INSERT INTO dbo.VistaFebbraio (IDNegozio, Mese, Venduto) VALUES (1, 2, 3000) INSERT INTO dbo.VistaFebbraio (IDNegozio, Mese, Venduto) VALUES (4, 2, 3500.67) GO SELECT Negozio = N.Nome , [Venduto Gennaio] = ISNULL(G.Venduto, 0) , [Venduto Febbraio] = ISNULL(F.Venduto, 0) FROM dbo.Negozi N LEFT JOIN dbo.VistaGennaio G ON G.IDNegozio = N.IDNegozio LEFT JOIN dbo.VistaFebbraio F ON F.IDNegozio = N.IDNegozio DROP TABLE dbo.VistaFebbraio DROP TABLE dbo.VistaGennaio DROP TABLE dbo.Negozi GO
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Pongo Profilo | Senior Member

Ciao Alex!

Purtroppo una left join partendo dalla prima non va bene in quanto ci può essere un articolo del primo negozio che viene venduto nell'ultimo mese.

Cioè comincio con gennaio, febbraio e l'alrticolo è venduto a marzo.

Quindi vorrei negozio, articolo, 0,0, qtaveduta a marzo.

MI verrebbe da pensare ad un cubo, pur non sapendo esattamente che cos'è!!

alx_81 Profilo | Guru

>Purtroppo una left join partendo dalla prima non va bene in quanto
>ci può essere un articolo del primo negozio che viene venduto
>nell'ultimo mese.
Mi sa che mi sono spiegato male. A te serve l'insieme di tutti i NEGOZI possibili, da cui partire per legarti alle due viste. Come vedi nel mio esempio, creo una tabella dei negozi (TUTTI) e poi simulo le due viste. Hai una tabella con tutti i negozi? Se non la hai, sarebbe buona cosa farla

>MI verrebbe da pensare ad un cubo, pur non sapendo esattamente che cos'è!!
Piano!!
Prima di arrivare ad un cubo, bisogna avere una realtà che lo richieda e necessità notevoli..


--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Pongo Profilo | Senior Member

Sì ce l'ho la tabella, ma i negozio vengono sempre fuori tutti.

Sono gli articoli venduti nei singoli mesi sui quali ho problemi. Comunque domani provo.

intanto grazie!

alx_81 Profilo | Guru

>Sono gli articoli venduti nei singoli mesi sui quali ho problemi.
>Comunque domani provo.
ok, allora cerca di spiegarmi bene cosa ti serve, passandomi le strutture delle tabelle e qualche insert di esempio.
Codice è il codice articolo? In tal caso, basta spostare il ragionamento sugli articoli. Ti serve una tabella degli articoli da cui partire per legarti a quelle viste.

>intanto grazie!
di nulla!

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Pongo Profilo | Senior Member

Ciao Alessandro, allora ho portato il tuo esempio al mio caso e sono riuscito a fare il tutto!

In pratica mi serviva partire da una tabella che contenesse tutte le anagrafiche legate al negozio, poi ho escluso quelle che non sono mai state vendute!

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