У меня есть таблица, называемая арендой с периодом и суммой счета PK

TenancyPK     Accountperiod     Amount
48738562851   2018/04           1458
48738562851   2018/08           45

Я использую этот код, чтобы сделать все учетные периоды

DECLARE @StartDate  DATETIME,
    @EndDate    DATETIME

SELECT   @StartDate = '20110501'        
    ,@EndDate   = '20110801'


SELECT  DATENAME(MONTH, DATEADD(MONTH, x.number, @StartDate)) AS MonthName
FROM    master.dbo.spt_values x
WHERE   x.type = 'P'        
AND     x.number <= DATEDIFF(MONTH, @StartDate, @EndDate)

Я хочу увидеть

TenancyPK     Accountperiod     Amount
48738562851   2018/04           1458
48738562851   2018/05           0
48738562851   2018/06           0
48738562851   2018/07           0
48738562851   2018/08           45
0
JD_123 11 Фев 2020 в 13:07

2 ответа

Лучший ответ

Вы можете использовать рекурсивный CTE:

with dates as (
      select @StartDate as dte,
             convert(varchar(7), @StartDate, 111) as Accountperiod  -- don't ask what "111" is
      union all
      select dateadd(month, 1, dte),
             convert(varchar(7), dateadd(month, 1, dte), 111) as Accountperiod  -- don't ask what "111" is
      from dates
      where dte < @EndDate
     ) 
select t.TenancyPK, d.Accountperiod, coalesce(ty.amount, 0) as amount
from (select distinct TenancyPK from tenancy) t cross join
     dates d left join
     Tenancy ty
     on ty.TenancyPK = t.TenancyPK and
        ty.Accountperiod = d.Accountperiod;
0
Gordon Linoff 11 Фев 2020 в 12:23

Объявите табличную переменную с колонкой «Количество» по умолчанию 0.

DECLARE @myTable TABLE (TenancyPK INT, AccountPeriod VARCHAR(7), Amount MONEY DEFAULT 0)

Затем вставьте записи всех периодов финансового года без расчета суммы. Затем обновите столбец суммы с помощью запроса.

В заключение

SELECT * 
FROM  @myTable
0
Harshana 13 Фев 2020 в 11:22