Da, se poate. Uite un exemplu cât de cât interesant:
USE AdventureWorks
GO
CREATE FUNCTION MonthlySalesForAProduct(@ProductID int)
RETURNS TABLE AS RETURN
WITH TotalSalesForAProduct AS (
SELECT YEAR(OrderDate) as Y, MONTH(OrderDate) as M, SUM(OrderQty) as Qty
FROM Sales.SalesOrderHeader h
INNER JOIN Sales.SalesOrderDetail d ON h.SalesOrderID=d.SalesOrderID
WHERE d.ProductID=@ProductID
GROUP BY YEAR(OrderDate), MONTH(OrderDate)
)
SELECT a.Y, a.M, a.Qty, b.Qty as PrevQty,
CONVERT(numeric(10,2),100.*(a.Qty-b.Qty)/b.Qty) as PercentChange
FROM TotalSalesForAProduct a LEFT JOIN TotalSalesForAProduct b
ON a.Y*12+a.M=b.Y*12+b.M+1
--ORDER BY Y, M
GO
SELECT * FROM MonthlySalesForAProduct(761) ORDER BY Y, M
Am preferat să fac o funcţie, ca să pot să refolosesc rezultatul în alte query-uri, dar se putea utiliza un parametru într-un CTE şi dacă era procedură stocată.
Dacă ai probleme, postează codul pe care l-ai scris (cu structura tabelelor, câteva date de test şi rezultatele dorite).
Răzvan