Hemil Gandhi Ответов: 1

Дата мудрый запрос баланса


Привет Кодеры,

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

Что у меня есть

Дата Бал
02-04-2020 200
03-04-2020 100
05-04-2020 300
08-04-2020 400



Чего я хочу

02-04-2020 200
03-04-2020 100
04-04-2020 100
05-04-2020 300
06-04-2020 300
07-04-2020 300
08-04-2020 400

Что я уже пробовал:

Ничего я не пробовал я ничего не знаю об этом требовании

Gerry Schmitz

В отсутствие "почему", никто не хранит "вычисленные значения"; вы производите их, когда это необходимо.

Если запрос был сделан для баланса, скажем, 07-04-2020, то вы найдете верхнюю 1 балансовую запись с датой "равной или меньшей" целевой даты.

1 Ответов

Рейтинг:
1

Maciej Los

Вы можете использовать рекурсивный запрос (CTE)[^]. Видеть:

SET DATEFORMAT dmy; 

CREATE TABLE Balance
(
  [Date] date,
  Bal int
);

INSERT INTO Balance ([Date], Bal)
VALUES('02-04-2020', 200),
('03-04-2020', 100),
('05-04-2020', 300),
('08-04-2020', 400)

;WITH CTE AS 
(
  SELECT MIN([Date]) MinDate, MIN([Date]) CurrDate, Max([Date]) MaxDate
  FROM Balance
  UNION ALL
  SELECT MinDate, DATEADD(DD, 1, CurrDate) CurrDate, MaxDate
  FROM CTE
  WHERE DATEADD(DD, 1, CurrDate)<= MaxDate

)
SELECT c.CurrDate, b.Bal
FROM CTE c LEFT JOIN Balance b ON c.CurrDate = b.[Date]


Ссылка на db<>скрипка[^]

Выше запрос возвращает этот:
CurrDate 	Bal
2020-04-02 	200
2020-04-03 	100
2020-04-04 	
2020-04-05 	300
2020-04-06 	
2020-04-07 	
2020-04-08 	400


Теперь твоя очередь. Улучшите это к вашим потребностям.


Sandeep Mewara

5

Maciej Los

Спасибо, Сандип.