SqlServer - Как отображать данные каждого месяца, включая месяцы без данных - PullRequest
0 голосов
/ 08 мая 2019

Не могли бы вы помочь мне на сервере Sql, у меня есть таблица, откуда я получаю мудрые данные. Структура таблицы.

Date     Amount
-----------------   
2019-05-04  16128.00
2019-05-06  527008.00
2019-05-07  407608.00
2019-05-10  407608.00

Над запросом я хочу заполнить пропущенную дату, Мои ожидания, как показано ниже

Date     Amount
-----------------   
2019-05-04  16128.00
2019-05-05  00
2019-05-06  527008.00
2019-05-07  407608.00
2019-05-08  0
2019-05-09  0
2019-05-10  407608.00

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Один довольно простой метод - использовать рекурсивный CTE для генерации дат, а затем left join для ввода дней:

with cte as (
      select min(t.dte) as dte, max(t.dte) as maxdate
      from t
      union all
      select dateadd(day, 1, dte), maxdate
      from cte 
      where dte < maxdate
     )
select cte.dte, coalesce(t.amount, 0) as amount
from cte left join
     t
     on cte.dte = t.dte;

Здесь - это дБ <> скрипка.

Обратите внимание, что глубина рекурсии по умолчанию равна 100, поэтому для более длительных периодов следует добавить OPTION (MAXRECURSION 0).

0 голосов
/ 08 мая 2019

Вы можете использовать справочную таблицу Calndar, в противном случае назначьте дату начала и дату, например DECLARE @fromdate DATE = '20190504', @todate DATE = '20190510', дату и дату, которую вы можете изменить.

    CREATE TABLE #amounttable
    (
      Dt DATE, 
      Amount BIGINT
    );
    INSERT into #amounttable(Dt, Amount) VALUES('2019-05-04',16128);
    INSERT into #amounttable(Dt, Amount) VALUES('2019-05-06',527008);
    INSERT into #amounttable(Dt, Amount) VALUES('2019-05-07',407608);
    INSERT into #amounttable(Dt, Amount) VALUES('2019-05-10',407608);


DECLARE @fromdate DATE = '20190504', @todate DATE = '20190510';

SELECT c.d as Date, Amount = COALESCE(s.Amount,0)
  FROM 
(
   SELECT TOP (DATEDIFF(DAY, @fromdate, @todate)+1)
 DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY number)-1, @fromdate)
 FROM [master].dbo.spt_values
 WHERE [type] = N'P' ORDER BY number
) AS c(d)
  LEFT OUTER JOIN #amounttable AS s
  ON c.d = s.Dt
  WHERE c.d >= @fromdate
    AND c.d < DATEADD(DAY, 1, @todate);

для получения дополнительной справки проверьте ответ здесь из стека обмена

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...