我有一个现有查询,其中我有一个每年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
答案 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