Problema con left join

giovedì 16 aprile 2009 - 18.12

perla0279 Profilo | Senior Member

Ciao

ho creato due tabelle

Una vista con dentro i anno/ mesi:
2009 1
2009 2
.....
2008 1
.....

Quindi dentro ci sono tutti i mesi.

Poi ho un'altra tabella dove sommo un campo numerico ragruppando per data (mese/anno)

Il mio problema è che alcune volte non ho il dato numerico per il mese corispondente.

Vorrei che mettendo in join le due tabelle mi venisse fuori lo stess..... invece se manca l'importo numerico non mi visualizza neanche il mese



SELECT a.ANNO, a.MESE,
sum (b.IMP_VENDITA)
FROM dbo.F002_IMMESSO as B RIGHT OUTER JOIN
DWH_STAGING.dbo.V_RPT_AMM_CALENDARIO as A ON year (b.DAT_DATA) = a.ANNO AND
month (b.DAT_DATA) = a.MESE
where b.COD_ARTICOLO = 761421
group by year (b.DAT_DATA) , month (b.DAT_DATA), a.ANNO, a.MESE

mi torna una cosa simile a questa:

2008 5 1
2008 8 19
2008 9 3

mancano dei mesi...

ho provato anche con left join ma non cambia

alx_81 Profilo | Guru

>Ciao
Ciao

>mi torna una cosa simile a questa:
>
>2008 5 1
>2008 8 19
>2008 9 3
>
>mancano dei mesi...
>ho provato anche con left join ma non cambia
Certo, è la where che ti esclude i record in cui quell'articolo non esiste
facciamo una bella cosa, passaci la create delle due tabelle e la insert di alcuni dati di esempio, affinchè noi possiamo provare la query.
ciao!

--

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

perla0279 Profilo | Senior Member

allora
1° tabella :

CREATE TABLE [dbo].[QTA](
[data_ad] [datetime] NULL,
[codice] [int] NULL,
[qta] [int] NULL
) ON [PRIMARY]

dati inseriti:
INSERT INTO [vecchio].[dbo].[QTA]
([data_ad]
,[codice]
,[qta])
VALUES
(<data_ad, datetime,>
,<codice, int,>
,<qta, int,>)
10/01/2009 0.00.00 1 5
11/01/2009 0.00.00 2 2
16/01/2009 0.00.00 3 6
20/01/2009 0.00.00 2 8
01/03/2009 0.00.00 5 9
02/03/2009 0.00.00 5 6
05/04/2009 0.00.00 1 4
06/04/2009 0.00.00 1 7
01/01/2008 0.00.00 1 5
05/01/2008 0.00.00 5 8
05/02/2006 0.00.00 3 9
06/09/2008 0.00.00 2 6
02/09/2008 0.00.00 1 6
12/11/2008 0.00.00 2 6

(non sono riuscita a creare uno script con i dati :.............. :-( per l'insert )

CREATE TABLE [dbo].[mesi](
[mese] [int] NULL,
[anno] [int] NULL
) ON [PRIMARY]

questa a dentro il mese e l'anno

2008 1
2008 2
2008 3
2008 4
2008 5
ecc.....

c'è da visulizzare tutti i mesi e anno della tabella MESI e associare (quando c'è un valore altrimenti metterò o null o 0 ) la somma del valore qta della tabella QTA ragruppando la sum per mese ed anno sempre della tabella QTA

SELECT a.ANNO, a.MESE,
sum (b.QTA)
FROM QTA as B RIGHT OUTER JOIN
MESI as A ON year (b.data_ad) = a.ANNO AND
month (b.data_ad) = a.MESE
group by year (b.data_adA) , month (b.data_ad), a.ANNO, a.MESE


spero di avervi dato tutte le informazioni che vi servono

lbenaglia Profilo | Guru

>SELECT a.ANNO, a.MESE,
>sum (b.QTA)
>FROM QTA as B RIGHT OUTER JOIN
>MESI as A ON year (b.data_ad) = a.ANNO AND
>month (b.data_ad) = a.MESE
>group by year (b.data_adA) , month (b.data_ad), a.ANNO, a.MESE

Ciao Elena,

Sbagli il raggruppamento: è sufficiente specificare anno e mese della tabella Mesi.

USE tempdb; CREATE TABLE dbo.Qta( data_ad date NOT NULL, codice int NOT NULL, qta int NULL ); INSERT dbo.Qta VALUES ('20090110', 1, 5) , ('20090111', 2, 2) , ('20090116', 3, 6) , ('20090120', 2, 8) , ('20090301', 5, 9) , ('20090302', 5, 6) , ('20090405', 1, 4) , ('20090406', 1, 7) , ('20080101', 1, 5) , ('20080105', 5, 8) , ('20060205', 3, 9) , ('20080906', 2, 6) , ('20080902', 1, 6) , ('20081112', 2, 6); CREATE TABLE dbo.Mesi( anno int NOT NULL, mese int NOT NULL ); INSERT dbo.Mesi VALUES (2008, 1) , (2008, 2) , (2008, 3) , (2008, 4) , (2008, 5) , (2008, 6) , (2008, 7) , (2008, 8) , (2008, 9) , (2008, 10) , (2008, 11) , (2008, 12) , (2009, 1) , (2009, 2) , (2009, 3); SELECT M.mese, M.anno, COALESCE(SUM(Q.Qta), 0) AS tot FROM dbo.Mesi AS M LEFT JOIN dbo.Qta AS Q ON M.anno = YEAR(Q.data_ad) AND M.mese = MONTH(Q.data_ad) GROUP BY M.mese, M.anno; /* Output: mese anno tot ----------- ----------- ----------- 1 2008 13 2 2008 0 3 2008 0 4 2008 0 5 2008 0 6 2008 0 7 2008 0 8 2008 0 9 2008 12 10 2008 0 11 2008 6 12 2008 0 1 2009 21 2 2009 0 3 2009 15 (15 row(s) affected) */ DROP TABLE dbo.Qta, dbo.Mesi;

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

alx_81 Profilo | Guru

Ti riallego l'esempio, avevo messo un paio di commenti in più:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

perla0279 Profilo | Senior Member

ottimo

in effeti così funziona
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