Я попробовал приведенный ниже пример на SQL сервере.
- Для начала необходимо иметь таблицу дат со списком дат.
- Затем вам нужно указать комбинацию даты и значения идентификатора.
- Теперь вам нужно заполнить значение val, если оно существует на дату, в противном случае оно будет равно 0.
DECLARE @FromDate DATETIME, @ToDate DATETIME;
SET @FromDate = '2020-02-01';
SET @ToDate = '2020-02-28';
DECLARE @DateTable TABLE(theDate DATE)
DECLARE @datasource TABLE(id int, dateVal DATE, Val INT)
-- all days in that period
INSERT INTO @DateTable
SELECT TOP (DATEDIFF(DAY, @FromDate, @ToDate)+1)
TheDate = CAST(DATEADD(DAY, number, @FromDate) AS DATE)
FROM [master].dbo.spt_values
WHERE [type] = N'P' ORDER BY number;
--
INSERT INTO @datasource
VALUES
(59895,'2020-02-01',5),(59895,'2020-02-03',7),
(59888,'2020-02-01',2),(59888,'2020-02-02',10)
;WITH CTE_idDates AS
(
SELECT theDate,id FROM @DateTable
CROSS JOIN
@datasource
)
SELECT theDate, id,
COALESCE((SELECT Val from @dataSource WHERE dateval=c.thedate and id=c.id),0)
FROM CTE_idDates AS c
Результирующий набор
+------------+-------+------------------+
| theDate | id | (No column name) |
+------------+-------+------------------+
| 2020-02-01 | 59895 | 5 |
| 2020-02-02 | 59895 | 0 |
| 2020-02-03 | 59895 | 7 |
| 2020-02-04 | 59895 | 0 |
| 2020-02-05 | 59895 | 0 |
| 2020-02-06 | 59895 | 0 |
.
.
.
| 2020-02-28 | 59895 | 0 |
| 2020-02-01 | 59888 | 2 |
| 2020-02-02 | 59888 | 10 |
.
.
.
| 2020-02-26 | 59888 | 0 |
| 2020-02-27 | 59888 | 0 |
| 2020-02-28 | 59888 | 0 |
+------------+-------+------------------+