WITH OrdersCTE(OrderID, OrderDate)
AS (SELECT SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader),
OrdersBOMCTE(OrderID, OrderDate, BOM)
AS (SELECT *, CAST(CONVERT(Varchar(6), OrderDate, 112)
+ '01' AS datetime)
FROM OrdersCTE),
OrdersBOMEOMCTE(OrderID, OrderDate, BOM, EOM)
AS (SELECT *, DATEADD(day, -1, DATEADD(month, 1, BOM))
FROM OrdersBOMCTE)
SELECT * FROM OrdersBOMEOMCTE;