Еще одна опция таблицы подсчета (с использованием MS SQL Server 2016)
Чтобы получить этот результат:
Это код:
;with TempTable AS(
SELECT
2019317 AS Amount, 'Commercial Auto' AS InsurType, 1 AS MonthNumber, '2018-01-01 00:00:00.000' AS PostDate, 31 AS DaysInMonth
UNION ALL SELECT 3757832, 'Commercial Auto', 2, '2018-01-01 00:00:00.000', 28
UNION ALL SELECT 5010746, 'Commercial Auto', 3, '2018-01-01 00:00:00.000', 31
UNION ALL SELECT 4461429.66, 'Commercial Auto', 4, '2018-01-01 00:00:00.000', 30
UNION ALL SELECT 4049404.44, 'Commercial Auto', 5, '2018-01-01 00:00:00.000', 31
)
,Tally AS(
SELECT top 31
rn = Row_number() OVER(ORDER BY (SELECT NULL))
FROM sys.objects
)
SELECT
TempTable.*,
rn AS DayNum,
MonthlyAmount = round(cast(TempTable.amount / TempTable.DaysInMonth as money), 0)
FROM TempTable
cross join Tally
where
DaysInMonth = rn
--rn <= DaysInMonth
Order by MonthNumber, rn
Чтобы получить этот другой результат:
![enter image description here](https://i.stack.imgur.com/7eT40.png)
Это код:
;with TempTable AS(
SELECT
2019317 AS Amount, 'Commercial Auto' AS InsurType, 1 AS MonthNumber, '2018-01-01 00:00:00.000' AS PostDate, 31 AS DaysInMonth
UNION ALL SELECT 3757832, 'Commercial Auto', 2, '2018-01-01 00:00:00.000', 28
UNION ALL SELECT 5010746, 'Commercial Auto', 3, '2018-01-01 00:00:00.000', 31
UNION ALL SELECT 4461429.66, 'Commercial Auto', 4, '2018-01-01 00:00:00.000', 30
UNION ALL SELECT 4049404.44, 'Commercial Auto', 5, '2018-01-01 00:00:00.000', 31
)
,Tally AS(
SELECT top 31
rn = Row_number() OVER(ORDER BY (SELECT NULL))
FROM sys.objects
)
SELECT
TempTable.*,
rn AS DayNum,
MonthlyAmount = round(cast(TempTable.amount / TempTable.DaysInMonth as money), 0)
FROM TempTable
cross join Tally
where
--DaysInMonth = rn
rn <= DaysInMonth
Order by MonthNumber, rn