Чтобы иметь строку для каждой даты в вашем диапазоне, было бы полезно использовать таблицу Календаря. Есть много ресурсов о том, как это сделать one . Другой вариант - создать таблицу календаря на лету в виде общего табличного выражения (CTE), например this .
При разработке хранимой процедуры мне нравится получать он работает так же, как обычный оператор SQL, и когда у меня есть это, я могу преобразовать его в хранимую процедуру. Итак, вот регулярное выражение SQL, которое должно помочь вам.
DECLARE
@FromDate DATE
, @ToDate DATE
, @Supplier INT
, @MOP INT;
-- set these values to whatever you would pass to your stored procedure
SET @FromDate = '2020-03-01';
SET @ToDate = '2020-03-31';
SET @Supplier = 2;
SET @MOP = 3;
DECLARE @Expenditure TABLE
(
ID INT NOT NULL
, TranDate DATE NOT NULL
, SupplierID INT NOT NULL
, MOP INT NOT NULL
, NetAmount DECIMAL(10, 2) NOT NULL
);
INSERT INTO @Expenditure (ID, TranDate, SupplierID, MOP, NetAmount)
VALUES
(1, '02/28/2020', 2, 3, 200.12)
, (2, '03/15/2020', 2, 3, 125.10)
, (3, '03/15/2020', 2, 3, 74.90)
, (4, '03/17/2020', 3, 3, 150.32)
, (5, '03/18/2020', 2, 3, 250.78)
;WITH cteCalendar (MyDate) AS
(
SELECT CONVERT(DATE, @FromDate) AS MyDate
UNION ALL
SELECT DATEADD(DAY, 1, MyDate)
FROM cteCalendar
WHERE DATEADD(DAY, 1, MyDate) <= @ToDate
)
SELECT
ROW_NUMBER() OVER (ORDER BY x.TranDate) AS [RowNo]
, x.TranDate
, x.NetExpense
FROM (
SELECT
c.MyDate AS TranDate
, SUM(e.NetAmount) AS [NetExpense]
FROM cteCalendar c
LEFT JOIN @Expenditure e ON c.MyDate = e.TranDate
AND e.SupplierID = @Supplier
AND e.MOP = @MOP
GROUP BY c.MyDate
) x;
Вот демо кода.