Как повторить даты для кратных значений и заполнить пропущенные даты в SQL - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть таблица с датой, ID и значениями, которая выглядит следующим образом

enter image description here

Я хочу повторить диапазон дат (дата начала, дата окончания) для всех идентификаторов, и, если значение отсутствует для какой-либо даты, введите 0.

enter image description here

Как этого добиться в SQL? Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

Просто используйте cross join для генерации строк и left join для ввода существующих значений:

select i.id, t.date, coalesce(t.value, 0) as value
from (select distinct id from t) i cross join
     (select distinct date from t) left join
     t
     on t.id = i.id and t.date = i.date;

Вы можете использовать insert into или select into, чтобы поместить эти данные в другую таблицу.

1 голос
/ 24 апреля 2020

Я попробовал приведенный ниже пример на SQL сервере.

  1. Для начала необходимо иметь таблицу дат со списком дат.
  2. Затем вам нужно указать комбинацию даты и значения идентификатора.
  3. Теперь вам нужно заполнить значение 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 |
+------------+-------+------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...