在每月,每季度和每年中将起始日期和结束日期的日期分开

时间:2019-09-17 12:08:06

标签: sql sql-server

我有一个现有查询,其中我有一个每年BusinessGoal.period = 'Year'的休假日期,现在我必须修改查询以在BusinessGoal.period = 'Monthly'BusinesGoal.period = 'Quarterly'上插入一个检查。我插入了一个示例表,其中第一个表是原始表(BusinessGoal),第二个表是我们希望从SQL查询获得的最终输出。

BusinessRefId   Period  GoalType    Amount  StartDateUtc    EndDateUtc  Currency
Business A  Year    CommittedTransactionFee 45000   07/06/19 00:00      USD
Business B  Year    CommittedTransactionFee 18000   07/06/17 00:00      USD
Business C  Month   CommittedTransactionFee 18000   05/07/19 00:00      USD
Business D  Quarter CommittedTransactionFee 5000    01/04/19 00:00      USD
Business E  Year    CommittedTransactionFee 5000    01/04/2019  01/08/2019  USD



BusinessRefId   Period  GoalType    Amount  StartDateUtc    EndDateUtc  Currency
Business A  2019-2020   CommittedTransactionFee 45000   07/06/2019  07/06/2020  USD
Business B  2019-2020   CommittedTransactionFee 18000   07/06/19 00:00  07/06/2020  USD
Business B  2018-2019   CommittedTransactionFee 18000   07/06/18 00:00  07/06/2019  USD
Business B  2017-2018   CommittedTransactionFee 18000   07/06/17 00:00  07/06/2018  USD
Business C  2019-07 - 2019-08   CommittedTransactionFee 18000   05/07/19 00:00  05/08/2019  USD
Business C  2019-08 - 2019-09   CommittedTransactionFee 18000   05/08/19 00:00  05/09/2019  USD
Business C  2019-09 - 2019-10   CommittedTransactionFee 18000   05/09/19 00:00  05/10/2019  USD
Business D  2019-Q2 CommittedTransactionFee 5000    01/04/19 00:00  01/06/2019  USD
Business D  2019-Q3 CommittedTransactionFee 5000    01/06/19 00:00  01/10/2019  USD
Business E  2019    CommittedTransactionFee 5000    01/08/2019  01/04/2019  USD

最初运行的原始查询是根据BusinessGoal.Period仅具有一个值,即“ Year”来中断日期。

;WITH Generate_Dates(Start_Date, End_Date) AS (
  SELECT
    CAST(StartDateUtc AS Date),
    CAST(
      CASE WHEN [bg].EndDateUtc IS NULL THEN GETDATE() ELSE CAST([bg].EndDateUtc AS Date) end AS Date
    )
  FROM
    BusinessGoal AS [bg] WITH (NOLOCK)
  WHERE
    [bg].Period = 'Year'
  UNION ALL
  SELECT
    DATEADD(yy, 1, Start_Date),
    End_Date
  FROM
    Generate_Dates
  WHERE
    DATEADD(yy, 1, Start_Date) < End_Date
)
SELECT
  (
    Generate_Dates.Start_Date
  ) AS "Start Period Date",
  (
    Generate_Dates.End_Date
  ) AS "End Period Date",
  [bg].BusinessRefId AS 'Brand',
  (
    CAST (
      [bg].Amount AS DECIMAL
    )
  ) AS "Committed Transaction Fee",
  (
    SELECT
      CAST (
        sum (
          (
            CASE WHEN [s].Credit = 0 THEN - [s].SettlementAmount ELSE [s].SettlementAmount END
          )
        ) AS DECIMAL
      )
  ) AS "Actual Transaction Fee",
  (
    SELECT
      TOP 1 (
        CASE [s].Culture WHEN 'en-US' THEN 'USD' WHEN 'en-CA' THEN 'CAD' WHEN 'en-IE' THEN 'EUR' WHEN 'en-AU' THEN 'AUD' WHEN 'en-NZ' THEN 'NZD' WHEN 'en-Gbg' THEN 'GbgP' WHEN 'es-MX' THEN 'MXN' WHEN 'jp-JP' THEN 'JPY' WHEN 'nbg-NO' THEN 'NOK' end
      )
    FROM
      Settlement AS [s] WITH (NOLOCK)
  ) AS "Currency"
FROM
  Settlement AS [s] WITH (NOLOCK)
  INNER JOIN OrderProductVariant AS [opv] WITH (NOLOCK) ON
  (
    [opv].MRefId = [s].CompanyRefId
    AND [opv].Id = [s].OrderProductVariantId
  )
  INNER JOIN Manufacturer WITH (NOLOCK) on Manufacturer.RefId = [opv].MRefId
  INNER JOIN [Order] AS [o] WITH (NOLOCK) ON [o].Id = [opv].OrderId
  INNER JOIN BusinessGoal AS [bg] WITH (NOLOCK) ON [bg].BusinessRefId = [s].CompanyRefId 
  INNER JOIN Generate_Dates ON GoalType = 'CommittedTransactionFee'
WHERE
    StartDateUtc <= [s].CreatedOnUtc
    AND (
      (
        EndDateUtc >= [s].CreatedOnUtc
      )
      OR (EndDateUtc is null)
    )
GROUP BY
  Start_Date,
  End_Date,
  BusinessRefId,
  Amount,
  [bg].Currency

1 个答案:

答案 0 :(得分:2)

我每年,每月,每季度处理您的查询逻辑。检查以下查询。可能会有帮助。

declare @BusinessGoal table    
(BusinessRefId varchar(50),   
Period varchar(50), 
GoalType varchar(100),    
Amount money, 
StartDateUtc datetime,   
EndDateUtc datetime, 
Currency varchar(10))


insert into @BusinessGoal values
('Business A',  'Year',    'CommittedTransactionFee', 45000,   '07/06/19', '00:00',      'USD'),
('Business B',  'Year',   'CommittedTransactionFee', 18000,   '07/06/17', '00:00',      'USD'),
('Business E',  'Year',    'CommittedTransactionFee', 5000 ,   '01/08/2019',  '01/04/2019',  'USD'),
('Business C',  'Month',    'CommittedTransactionFee', 18000 ,   '07/05/2019',  '00:00',  'USD'),
('Business D',  'Quarter',    'CommittedTransactionFee', 5000 ,   '04/01/2019',  '00:00',  'USD')

--This is for temporary @period_table inserrtion dynamically
--Start--
declare @Min_DateUtc datetime,@Max_DateUtc datetime
select @Min_DateUtc=min(DateUtc) ,@Max_DateUtc=dateadd(yy,1,max(DateUtc))  from 
(
select StartDateUtc as DateUtc  from @BusinessGoal
union 
select EndDateUtc as DateUtc from @BusinessGoal
) a where DateUtc<>'' and DateUtc is not null

declare @period_table_temp table   
(period_number int,
period_name varchar(50),period_type varchar(50))

while (@Min_DateUtc<=@Max_DateUtc)
begin

    insert into @period_table_temp (period_number,period_name,period_type)
    select DATEPART(YYYY,@Min_DateUtc),
    cast(DATEPART(YYYY,@Min_DateUtc) as varchar(20))+'-'+cast(DATEPART(YYYY,@Min_DateUtc)+1 as varchar(20)),
    'Year'

    union

    select cast(convert(varchar(6), @Min_DateUtc,112) as int),
    left(convert(varchar(6), @Min_DateUtc,112),4)+'-'+right(convert(varchar(6), @Min_DateUtc,112),2)+' - '+
    left(convert(varchar(6), dateadd(MM,1,@Min_DateUtc),112),4)+'-'+right(convert(varchar(6), dateadd(MM,1,@Min_DateUtc),112),2),
    'Month'

    union

    select cast(CAST(datepart(YYYY,@Min_DateUtc) as varchar(4))+cast(datepart(QQ,@Min_DateUtc) as varchar(1)) as int),
    CAST(datepart(YYYY,@Min_DateUtc) as varchar(4))+'-Q'+cast(datepart(QQ,@Min_DateUtc) as varchar(1)) +' - '+
    CAST(datepart(YYYY,dateadd(QQ,1,@Min_DateUtc)) as varchar(4))+'-Q'+cast(datepart(QQ,dateadd(QQ,1,@Min_DateUtc)) as varchar(1))  ,
    'Quarter'
    set @Min_DateUtc=DATEADD(MM,1,@Min_DateUtc)
end


declare @period_table table   
(period_number int,
period_name varchar(50),period_type varchar(50))

insert into @period_table 
select distinct period_number,period_name,period_type from @period_table_temp

--End--


----- Combine all periods
---Year wise  
select 
a.BusinessRefId,
b.period_name,
a.GoalType,
a.Amount, 
DATEADD(YY,b.period_number-YEAR(a.StartDateUtc),a.StartDateUtc) as StartDateUtc,
case when a.EndDateUtc='' then  DATEADD(YY,b.period_number-YEAR(a.StartDateUtc)+1,a.StartDateUtc) else a.EndDateUtc end as EndDateUtc ,
a.Currency
from @BusinessGoal a 
inner join @period_table b on b.period_number  >=year(a.StartDateUtc)
where a.Period='Year' and b.period_number <=YEAR(GETDATE()) 

union all
---Month wise
select 
a.BusinessRefId,
b.period_name,
a.GoalType,
a.Amount, 
DATEADD(MM,b.period_number-cast(convert(varchar(6), a.StartDateUtc,112) as int),a.StartDateUtc) as StartDateUtc,
case when a.EndDateUtc='' then  DATEADD(MM,b.period_number-cast(convert(varchar(6), a.StartDateUtc,112) as int)+1,a.StartDateUtc) else a.EndDateUtc end as EndDateUtc ,
a.Currency 
from @BusinessGoal a 
inner join @period_table b on b.period_number  >=cast(convert(varchar(6), a.StartDateUtc,112) as int)
where a.Period='Month' and b.period_number <= convert(varchar(6), GETDATE(),112)
union all

-- Quarter wise
select 
a.BusinessRefId,
b.period_name,
a.GoalType,
a.Amount,
DATEADD(QQ,b.period_number-cast(CAST(year(a.StartDateUtc) as varchar(4))+cast(datepart(QQ,a.StartDateUtc) as varchar(1)) as int),a.StartDateUtc) as StartDateUtc,
case when a.EndDateUtc='' then  DATEADD(QQ,b.period_number-cast(CAST(year(a.StartDateUtc) as varchar(4))+cast(datepart(QQ,a.StartDateUtc) as varchar(1)) as int)+1,a.StartDateUtc) else a.EndDateUtc end as EndDateUtc ,
a.Currency 
from @BusinessGoal a 
inner join @period_table b on b.period_number  >=cast(CAST(year(a.StartDateUtc) as varchar(4))+cast(datepart(QQ,a.StartDateUtc) as varchar(1)) as int)
where a.Period='Quarter' and b.period_number <= cast(CAST(year(GETDATE()) as varchar(4))+cast(datepart(QQ,GETDATE()) as varchar(1)) as int)  
order by a.BusinessRefId,b.period_name



您可以插入@period_table表。我已经插入的基于上述值的每年,每月和每季度记录。

样本输出

----------------+-----------------------+---------------------------+---------------+---------------------------+---------------------------+-------------
BusinessRefId   |   period_name         |   GoalType                |   Amount      |   StartDateUtc            |   EndDateUtc              |   Currency
----------------+-----------------------+---------------------------+---------------+---------------------------+---------------------------+-------------
Business A      |   2019-2020           |   CommittedTransactionFee |   45000.00    |   2019-07-06 00:00:00.000 |   2020-07-06 00:00:00.000 |   USD
Business B      |   2017-2018           |   CommittedTransactionFee |   18000.00    |   2017-07-06 00:00:00.000 |   2018-07-06 00:00:00.000 |   USD
Business B      |   2018-2019           |   CommittedTransactionFee |   18000.00    |   2018-07-06 00:00:00.000 |   2019-07-06 00:00:00.000 |   USD
Business B      |   2019-2020           |   CommittedTransactionFee |   18000.00    |   2019-07-06 00:00:00.000 |   2020-07-06 00:00:00.000 |   USD
Business C      |   2019-07 - 2019-08   |   CommittedTransactionFee |   18000.00    |   2019-07-05 00:00:00.000 |   2019-08-05 00:00:00.000 |   USD
Business C      |   2019-08 - 2019-09   |   CommittedTransactionFee |   18000.00    |   2019-08-05 00:00:00.000 |   2019-09-05 00:00:00.000 |   USD
Business C      |   2019-09 - 2019-10   |   CommittedTransactionFee |   18000.00    |   2019-09-05 00:00:00.000 |   2019-10-05 00:00:00.000 |   USD
Business D      |   2019-Q2 - 2019-Q3   |   CommittedTransactionFee |   5000.00     |   2019-04-01 00:00:00.000 |   2019-07-01 00:00:00.000 |   USD
Business D      |   2019-Q3 - 2019-Q4   |   CommittedTransactionFee |   5000.00     |   2019-07-01 00:00:00.000 |   2019-10-01 00:00:00.000 |   USD
Business E      |   2019-2020           |   CommittedTransactionFee |   5000.00     |   2019-01-08 00:00:00.000 |   2019-01-04 00:00:00.000 |   USD
相关问题