Распределение стоимости динамически по неделям - PullRequest
0 голосов
/ 04 октября 2019

Я создаю промежуточную таблицу в SQL Server для использования с PowerBI для запроса финансовых данных.

У меня есть таблица финансовых транзакций tblfinance с

            CREATE TABLE TBLFinance
            (ID int,
            Value float,
            EntryDate date,
            ClientName varchar (250) 
            )

INSERT INTO TBLFinance(ID ,Value ,EntryDate ,ClientName)
                VALUES(1,'1783.26','2018-10-31 00:00:00.000','Alpha')
                , (2,'675.3','2018-11-30 00:00:00.000','Alpha')
                , (3,'243.6','2018-12-31 00:00:00.000','Alpha')
                , (4,'8.17','2019-01-31 00:00:00.000','Alpha')
                , (5,'257.23','2019-01-31 00:00:00.000','Alpha')
                , (6,'28','2019-02-28 00:00:00.000','Alpha')
                , (7,'1470.61','2019-03-31 00:00:00.000','Bravo')
                , (8,'1062.86','2019-04-30 00:00:00.000','Bravo')
                , (9,'886.65','2019-05-31 00:00:00.000','Bravo')
                , (10,'153.31','2019-05-31 00:00:00.000','Bravo')
                , (11,'150.24','2019-06-30 00:00:00.000','Bravo')
                , (12,'690.14','2019-07-31 00:00:00.000','Charlie')
                , (13,'21.67','2019-08-31 00:00:00.000','Charlie')
                , (14,'339.29','2018-10-31 00:00:00.000','Charlie')
                , (15,'807.96','2018-11-30 00:00:00.000','Delta')
                , (16,'48.94','2018-12-31 00:00:00.000','Delta')

Я рассчитываю значения транзакций, которые попадают в течение недели. Моя неделя заканчивается в воскресенье, поэтому у меня есть следующий запрос: INSERT INTO tblAnalysis (WeekTotal, WeekEnd, Client)

            SELECT SUM (VALUE) AS WeekTotal
            ,  dateadd (day, case when datepart (WEEKDAY, EntryDate) = 1 then 0 else 8 - datepart (WEEKDAY, EntryDate) end, EntryDate) AS WeekEnd
            , ClientName as Client
            FROM dbo.tblFinance
            GROUP BY dateadd (day, case when datepart (WEEKDAY, EntryDate) = 1 then 0 else 8 - datepart (WEEKDAY, EntryDate) end, EntryDate), CLIENTNAME

Теперь мне сообщили, что некоторые расходы, понесенные в течение данной недели, могут бытьежемесячно, и, следовательно, должны быть разделены на 4 недели или ежегодно, поэтому разделить на 52 недели. Я напишу описание случая, чтобы обновить затраты на основе ClientName, поэтому предположим, что есть дополнительное поле, называемое Payfrequency. Я хочу избежать необходимости извлекать затронутые значения во временную таблицу и эффективно записать это - потому что в зависимости от частоты будут применяться разные суммы.

            SELECT *
             INTO #MonthlyCosts
             FROM 
             ( 
             SELECT 
            client
            , VALUE / 4 AS VALUE 
            , WEEKENDING
              FROM tblAnalysis

                UNION 
                SELECT 
                client
                , nt_acnt 
                , VALUE / 4 AS VALUE 
                , DATEADD(WEEK,1,WEEKENDING) AS WEEKENDING 
                  FROM tblAnalysis
              UNION 
                   SELECT 
                client

                , VALUE / 4 AS VALUE 
                , DATEADD(WEEK,2,WEEKENDING) AS WEEKENDING 
                  FROM tblAnalysis
             UNION 
                   SELECT 
                client

                , VALUE / 4 AS VALUE 
                , DATEADD(WEEK,3,WEEKENDING) AS WEEKENDING 
                  FROM tblAnalysis
            ) AS A

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

Ответы [ 2 ]

1 голос
/ 04 октября 2019

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

with cte as (
      select ID, Value, EntryDate, ClientName, payfrequency, 1 as n
      from TBLFinance f
      union all
      select ID, Value, EntryDate, ClientName, payfrequency, n + 1
      from cte
      where n < payfrequency
     )
select *
from cte;

Обратите внимание, что по умолчанию это ограничено 100 шагами рекурсии. Вы можете добавить option (maxrecursion 0) на неограниченное количество дней.

0 голосов
/ 04 октября 2019

Лучшим решением было бы использовать таблицу чисел. Если вы можете создать таблицу на вашем сервере с одним столбцом, содержащим последовательность целых чисел. Затем вы можете использовать его следующим образом:

SELECT 
     client
    , VALUE / 52 AS VALUE 
    , DATEADD(WEEK,N.Number,WEEKENDING) AS WEEKENDING 
    FROM tblAnalysis AS A
    CROSS JOIN tblNumbers AS N
WHERE NCHAR.Number <=52
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...