Some more sample data would probably make sense. Have a play with this and see how you get on:
-- Amended function
ALTER FUNCTION [dbo].[IF_Calendar] (@Enddate DATE)
RETURNS TABLE AS RETURN
WITH
e1 AS (SELECT d.n FROM (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) d (n)),
e2 AS (SELECT a.n FROM e1 a, e1 b),
iTally AS (SELECT n = -1+ROW_NUMBER() OVER(ORDER BY (SELECT NULL))FROM e2 a, e2 b)
SELECT TheDate, [DayName],
DayNo = 1+(DATEPART(dw, TheDate)+@@DATEFIRST-2)%7,
WeekNo = ROW_NUMBER() OVER(PARTITION BY YEAR(TheDate), MONTH(TheDate), [DayName] ORDER BY TheDate)
FROM ( -- f
SELECT TheDate, [DayName] = DATENAME(WEEKDAY,TheDate)
FROM ( -- e
SELECT TheDate = CAST(DATEADD(day,n,Startdate) AS DATE)
FROM ( -- d
SELECT
Startdate = DATEADD(YEAR,-2,DATEADD(MONTH,DATEDIFF(MONTH,0,@Enddate),0)),
Enddate = CAST(@Enddate AS DATE)
) d
CROSS APPLY (SELECT TOP(1+DATEDIFF(day,Startdate,Enddate)) n FROM iTally) x
) e
) f
GO
-- Amended query
;WITH MyData AS (SELECT * FROM (VALUES
('2012-11-12', 'DM1', 'Monday', 750),
('2012-11-12', 'DM4', 'Monday', 76),
('2012-11-12', 'DM5', 'Monday', 501),
('2012-11-13', 'DM1', 'Tuesday', 110),
('2012-11-13', 'DM4', 'Tuesday', 476),
('2012-11-13', 'DM5', 'Tuesday', 1501),
('2012-11-29', 'DM1', 'Thursday', 110),
('2012-11-29', 'DM4', 'Thursday', 476),
('2012-11-29', 'DM5', 'Thursday', 1501),
('2013-11-11', 'DM1', 'Monday', 1542),
('2013-11-11', 'DM4', 'Monday', 12),
('2013-11-11', 'DM2', 'Monday', 235),
('2013-11-12', 'DM1', 'Tuesday', 152),
('2013-11-12', 'DM3', 'Tuesday', 1214),
('2013-11-12', 'DM5', 'Tuesday', 2035),
('2013-11-28', 'DM1', 'Thursday', 1521),
('2013-11-28', 'DM3', 'Thursday', 4021),
('2013-11-28', 'DM4', 'Thursday', 25),
('2012-12-03','DM1','Monday',441),
('2012-12-03','DM3','Monday',10),
('2012-12-10','DM4','Monday',25),
('2013-12-02','DM1','Monday',1521),
('2013-12-03','DM4','Monday',4021),
('2013-12-03','DM4','Monday',25),
('2014-12-03','DM1','Thursday',1521),
('2014-12-03','DM3','Thursday',4021),
('2014-12-03','DM4','Thursday',25)
) d ([Date], Stack, [DayName], ParcelCount)
)
SELECT
[Month] = DATENAME(MONTH,c.TheDate),
m.Stack,
c.WeekNo,
c.[DayName],
ParcelCount2012 = SUM(CASE WHEN YEAR(c.TheDate) = 2012 THEN m.ParcelCount ELSE 0 END),
ParcelCount2013 = SUM(CASE WHEN YEAR(c.TheDate) = 2013 THEN m.ParcelCount ELSE 0 END),
ParcelCount2014 = SUM(CASE WHEN YEAR(c.TheDate) = 2014 THEN m.ParcelCount ELSE 0 END)
FROM [dbo].[IF_Calendar] (GETDATE()) c
inner JOIN MyData m
ON m.[Date] = c.TheDate
WHERE MONTH(c.TheDate) IN (11,12)
GROUP BY
MONTH(c.TheDate),
DATENAME(MONTH,c.TheDate),
c.WeekNo,
c.DayNo,
c.[DayName],
m.Stack
ORDER BY
MONTH(c.TheDate),
c.WeekNo,
c.DayNo,
c.[DayName],
m.Stack
For fast, accurate and documented assistance in answering your questions, please read this article.
Understanding and using APPLY, (I) and (II) Paul White
Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden