Узнайте квартал на основе финансового года в хранимой процедуре SQL Server - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть две таблицы, одна Period, а другая UserTarget.

Period таблица:

QuarterNo      StartDate    EndDate
-----------------------------------------
   1           2018-04-01   2018-06-30
   2           2018-07-01   2018-09-30
   3           2018-10-01   2018-12-31
   4           2019-01-01   2019-03-31

UserTarget таблица:

USERID    YEAR    QTR    AMOUNT
---------------------------------
akshay    2019     1      200

Сейчас я беру qtr no из таблицы периодов.Теперь мне не нужно брать QTR из таблицы периодов.Я хочу, чтобы хранимая процедура на основе года была введена в usertarget таблицу

Существующая хранимая процедура:

ALTER PROCEDURE [dbo].[GetQuarterlyTargetData]
    @Userid VARCHAR(50)
AS
BEGIN
    DECLARE @QuarterNumber VARCHAR(50)
    DECLARE @SetTarget DECIMAL(10);
    DECLARE @StartDate DATE
    DECLARE @EndDate DATE

    SELECT
        @QuarterNumber = p.QuarterNo,
        @SetTarget = AMOUNT 
    FROM 
        PERIOD p 
    LEFT OUTER JOIN 
        USERTARGETS s ON p.QuarterNo = s.QTR  
    WHERE
        StartDate <= GETDATE() AND EndDate >= GETDATE() 

    SELECT
        @StartDate = StartDate,
        @EndDate = EndDate 
    FROM 
        PERIOD 
    WHERE
        QuarterNo = @QuarterNumber

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

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Подумав, я подхожу к этому решению

ALTER PROCEDURE  [dbo].[Dashboard_GetQuarterlyTargetData]
    @Userid varchar(50)

    AS
    Begin 
         DECLARE @QuarterNumber varchar(50)
         DECLARE @SetTarget decimal(10);
         DECLARE @AchievedTarget decimal(10);
         DECLARE @TargetProgress decimal(10);
         DECLARE @RemainingTarget decimal(10);
         DECLARE @StartDate Date
         DECLARE @EndDate Date
         DECLARE @Year as int

        Select @QuarterNumber = QTR,@Year=YEAR,@SetTarget=AMOUNT from  USERTARGETS  where USERID=@Userid 

        if(@QuarterNumber = 1)
        begin
          SELECT @StartDate = DATEFROMPARTS(@year,4,1), @EndDate=DATEFROMPARTS(@year,6,30)
        End
        else if(@QuarterNumber = 2)
        begin
         SELECT @StartDate = DATEFROMPARTS(@year,7,1), @EndDate=DATEFROMPARTS(@year,9,30)
        End
        else if(@QuarterNumber = 3)
        begin
         SELECT @StartDate = DATEFROMPARTS(@year,10,1), @EndDate=DATEFROMPARTS(@year,12,31)
        End
        else if(@QuarterNumber = 4)
        begin
         SELECT @StartDate = DATEFROMPARTS(@year,1,1), @EndDate=DATEFROMPARTS(@year,3,31)
        End
0 голосов
/ 05 апреля 2019

Я считаю, что термин, который вы ищете, это финансовый год.Здесь год компании отличается от календарного года.

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

Вот один из способов сделать это.Поиск финансового года и квартала, вероятно, было бы целесообразно добавить в табличную функцию.

DECLARE @userTarget TABLE (UserId VARCHAR(20), Year INT, Quarter INT, Amount INT)
INSERT INTO @userTarget
VALUES
    ('akshay', 2018, 4, 150)
    ,('akshay', 2019, 1, 200)

SELECT
    s.UserId
    ,s.Amount
    ,FY.FiscalYear
    ,FQ.FiscalQuarter
FROM
    (
        SELECT
            --DATEFROMPARTS(2019, 2, 23) 
            GETDATE()
                AS reportDate
    ) AS ReportDate
    CROSS APPLY (
        SELECT
            CASE WHEN MONTH(ReportDate.reportDate) < 4 THEN YEAR(ReportDate.reportDate) - 1 -- Fiscal Year begins in April
                ELSE YEAR(ReportDate.reportDate)
            END AS FiscalYear
    ) AS FY
    CROSS APPLY (
        SELECT
            DATEDIFF(QUARTER, DATEFROMPARTS(FY.FiscalYear, 4, 1), ReportDate.reportDate) + 1 AS FiscalQuarter
    ) AS FQ
    INNER JOIN @userTarget s
        ON s.Year = FY.FiscalYear
            AND s.Quarter = FQ.FiscalQuarter

Кроме того, будьте осторожны с датами окончания.last_day >= GETDATE() не включает последний день.Возьмите в качестве примера конец прошлого квартала, он будет рассчитываться как '2019-03-31 00:00' >= '2019-03-31 08:20', что является ложным, если вы хотите, чтобы оно было истинным.

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