Torna al Thread
USE tempdb;
GO
CREATE TABLE dbo.QTA
(
Data_ad smalldatetime NULL --> non metterei null, dovrebbe essere sempre valorizzato e small, non ti serve il secondo preciso no?
, Codice int NULL --> non metterei null, dovrebbe essere sempre valorizzato
, Qta int NULL --> non metterei null, meglio un default a 0
)
GO
INSERT INTO [dbo].[QTA] (Data_ad,Codice,Qta)
VALUES('20090110', 1, 5)
INSERT INTO [dbo].[QTA] (Data_ad,Codice,Qta)
VALUES('20090111', 2, 2)
INSERT INTO [dbo].[QTA] (Data_ad,Codice,Qta)
VALUES('20090116', 3, 6)
INSERT INTO [dbo].[QTA] (Data_ad,Codice,Qta)
VALUES('20090120', 2, 8)
INSERT INTO [dbo].[QTA] (Data_ad,Codice,Qta)
VALUES('20090301', 5, 9)
INSERT INTO [dbo].[QTA] (Data_ad,Codice,Qta)
VALUES('20090302', 5, 6)
INSERT INTO [dbo].[QTA] (Data_ad,Codice,Qta)
VALUES('20090405', 1, 4)
INSERT INTO [dbo].[QTA] (Data_ad,Codice,Qta)
VALUES('20090406', 1, 7)
INSERT INTO [dbo].[QTA] (Data_ad,Codice,Qta)
VALUES('20080101', 1, 5)
INSERT INTO [dbo].[QTA] (Data_ad,Codice,Qta)
VALUES('20080105', 5, 8)
INSERT INTO [dbo].[QTA] (Data_ad,Codice,Qta)
VALUES('20060205', 3, 9)
INSERT INTO [dbo].[QTA] (Data_ad,Codice,Qta)
VALUES('20080906', 2, 6)
INSERT INTO [dbo].[QTA] (Data_ad,Codice,Qta)
VALUES('20080902', 1, 6)
INSERT INTO [dbo].[QTA] (Data_ad,Codice,Qta)
VALUES('20081112', 2, 6)
CREATE TABLE dbo.Mesi
(
Mese int NULL --> non metterei NULL, dovrebbe essere sempre valorizzato
, Anno int NULL --> non metterei NULL, dovrebbe essere sempre valorizzato
)
GO
-- qui metto tutti i mesi del 2008,2009 e 2006.
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2008,1)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2008,2)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2008,3)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2008,4)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2008,5)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2008,6)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2008,7)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2008,8)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2008,9)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2008,10)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2008,11)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2008,12)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2009,1)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2009,2)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2009,3)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2009,4)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2009,5)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2009,6)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2009,7)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2009,8)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2009,9)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2009,10)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2009,11)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2009,12)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2006,1)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2006,2)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2006,3)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2006,4)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2006,5)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2006,6)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2006,7)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2006,8)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2006,9)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2006,10)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2006,11)
INSERT INTO dbo.Mesi (anno, mese)
VALUES (2006,12)
GO
-- cerca di indentare il codice in modo che sia leggibile ;-)
SELECT
M.Anno
, M.Mese
, Quantita = ISNULL(SUM(Q.QTA), 0)
FROM
dbo.Mesi M
LEFT JOIN dbo.Qta Q ON YEAR(Q.data_ad) = M.Anno AND MONTH(Q.data_ad) = M.MESE
GROUP BY
M.Anno
, M.Mese
ORDER BY
M.Anno
, M.Mese
-- pulizia
DROP TABLE dbo.Qta
DROP TABLE dbo.Mesi
GO