[1] Cu titlu de exemplu:
DECLARE @AnCurent INT = 2010;
DECLARE @Facturi TABLE
(
IDFactura INT IDENTITY(1,1) PRIMARY KEY,
Data DATE NOT NULL,
Valoare INT NOT NULL
);
INSERT @Facturi
--2009
SELECT '2009-01-01', 100
UNION ALL
SELECT '2009-01-01', 101
UNION ALL
SELECT '2009-01-11', 111
UNION ALL
SELECT '2009-02-02', 200
UNION ALL
SELECT '2009-02-23', 222
UNION ALL
--2010
SELECT '2010-01-01', 1000
UNION ALL
SELECT '2010-02-01', 2000
UNION ALL
SELECT '2010-02-22', 2002
UNION ALL
SELECT '2010-02-22', 2022;
SELECT f.*
FROM @Facturi f;
WITH Rezultate
AS
(
SELECT f.Data,
YEAR(f.Data) AS An,
MONTH(f.Data) AS LunaDinAn,
DATEPART(wk, f.Data) AS SaptamanaDinAn,
DATEPART(dw, f.Data) AS ZiDinSaptamana,
SUM(f.Valoare) AS Valoare
FROM @Facturi f
GROUP BY f.Data,
YEAR(f.Data),
MONTH(f.Data),
DATEPART(wk, f.Data),
DATEPART(dw, f.Data)
), RezultateAC
AS
(
SELECT *
FROM Rezultate r
WHERE r.An = @AnCurent
), RezultateAT
AS
(
SELECT *
FROM Rezultate r
WHERE r.An = @AnCurent - 1
)
SELECT ac.Data AS DataAC,
at.Data AS DataAT,
COALESCE(ac.LunaDinAn, at.LunaDinAn) AS LunaDinAn,
COALESCE(ac.SaptamanaDinAn, at.SaptamanaDinAn) AS SaptamanaDinAn,
COALESCE(ac.ZiDinSaptamana, at.ZiDinSaptamana) AS ZiDinSaptamana,
COALESCE(ac.Valoare, 0) AS ValoareAC,
COALESCE(at.Valoare, 0) AS ValoareAT
FROM RezultateAC ac
FULL JOIN RezultateAT at ON ac.LunaDinAn = at.LunaDinAn
AND ac.SaptamanaDinAn = at.SaptamanaDinAn
AND ac.ZiDinSaptamana = at.ZiDinSaptamana
ORDER BY COALESCE(ac.LunaDinAn, at.LunaDinAn),
COALESCE(ac.SaptamanaDinAn, at.SaptamanaDinAn),
COALESCE(ac.ZiDinSaptamana, at.ZiDinSaptamana)[2] Non Recursive Common Table Expressions - Performance ...
[1] &
[2]