SELECT C.listcode, C.year, COUNT(NamesTest.year) as MailedFROM(SELECT * FROM (SELECT DISTINCT listcode FROM NamesTest) as A CROSS JOIN (SELECT DISTINCT year FROM NamesTest) as B) as CLEFT JOIN NamesTest ON C.listcode = NamesTest.listcode AND C.year = NamesTest.yearWhere c.Year > 2007GROUP BY c.listcode, c.yearOrder By c.listcode, c.year
SELECT listcode, year, COUNT(year) AS SoldFROM forteInfotestGROUP BY listcode, year
-- To obtain accurate rowcounts from the two tables, you need to aggregate them separately;WITH Matrix (listcode,[year]) AS ( (SELECT DISTINCT listcode FROM NamesTest) as A CROSS JOIN (SELECT DISTINCT [year] FROM NamesTest WHERE [Year] > 2007) as B)SELECT mx.listcode, mx.[year], n.Mailed, f.Sold FROM Matrix mxLEFT JOIN ( -- Using COUNT with a column name can be confusing, avoid - unless also specifying DISTINCT SELECT listcode, [year], COUNT(*) AS Mailed FROM NamesTest GROUP BY listcode, [year]) nLEFT JOIN ( SELECT listcode, [year], COUNT(*) AS Sold FROM forteInfotest GROUP BY listcode, [year]) f
SELECT *INTO #namesTestFROM ( SELECT Listcode = '102EL', [Year] = '2008' FROM (SELECT TOP(11488) n = 1 from sys.columns a, sys.columns b) d UNION ALL SELECT '102EL', '2009' FROM (SELECT TOP(11305) n = 1 from sys.columns a, sys.columns b) d UNION ALL SELECT '102EL', '2010' FROM (SELECT TOP(3607) n = 1 from sys.columns a, sys.columns b) d UNION ALL SELECT '102EL', '2011' FROM (SELECT TOP(46) n = 1 from sys.columns a, sys.columns b) d UNION ALL SELECT '170MD', '2008' FROM (SELECT TOP(25657) n = 1 from sys.columns a, sys.columns b) d --SELECT '170MD', '2009' 0 UNION ALL SELECT '170MD', '2010' FROM (SELECT TOP(15131) n = 1 from sys.columns a, sys.columns b) d UNION ALL SELECT '170MD', '2011' FROM (SELECT TOP(9039) n = 1 from sys.columns a, sys.columns b) d) q-- (76273 row(s) affected)SELECT *INTO #forteInfotestFROM ( SELECT listcode = '102EL', [year] = '2006' FROM (SELECT TOP(1) n = 1 from sys.columns a, sys.columns b) d UNION ALL SELECT '102EL', '2007' FROM (SELECT TOP(13) n = 1 from sys.columns a, sys.columns b) d UNION ALL SELECT '102EL', '2008' FROM (SELECT TOP(2) n = 1 from sys.columns a, sys.columns b) d UNION ALL SELECT '102EL', '2009' FROM (SELECT TOP(11) n = 1 from sys.columns a, sys.columns b) d UNION ALL SELECT '102EL', '2010' FROM (SELECT TOP(3) n = 1 from sys.columns a, sys.columns b) d UNION ALL SELECT '102EL', '2011' FROM (SELECT TOP(1) n = 1 from sys.columns a, sys.columns b) d) q-- (31 row(s) affected)-- query;WITH Matrix (listcode,[year]) AS ( SELECT * FROM (SELECT DISTINCT listcode FROM #NamesTest) a CROSS JOIN (SELECT DISTINCT [year] FROM #NamesTest WHERE [Year] > 2007) b) SELECT mx.listcode, mx.[year], n.Mailed, f.Sold FROM Matrix mxLEFT JOIN ( -- Using COUNT with a column name can be confusing, avoid - unless also specifying DISTINCT SELECT listcode, [year], COUNT(*) AS Mailed FROM #NamesTest GROUP BY listcode, [year]) n ON n.Listcode = mx.listcode AND n.year = mx.yearLEFT JOIN ( SELECT listcode, [year], COUNT(*) AS Sold FROM #forteInfotest GROUP BY listcode, [year]) f ON f.Listcode = mx.listcode AND f.year = mx.yearORDER BY mx.listcode, mx.[year]