2017-06-07 99 views
1

没有为每一天,另一台用于评价其使用基于收入的里程碑来计算性能与收入的销售表计算性能

CREATE TABLE #Rating(
    [Revenue] int NULL, 
    [Percentage] float NULL 
) ON [PRIMARY] 

insert into [#Rating] select 20000, 1.1 
insert into [#Rating] select 30000, 1.2 
insert into [#Rating] select 40000, 1.3 

CREATE TABLE #Sales(
    [Date] datetime, 
    [Revenue] int NULL 
) ON [PRIMARY] 

insert into #Sales select '2017-01-01', 7000 
insert into #Sales select '2017-01-02', 22000 
insert into #Sales select '2017-01-03', 33000 
insert into #Sales select '2017-01-04', 46000 
insert into #Sales select '2017-01-05', 50000 

我们想评估基于评级的销售业绩。例如,

如果收入达到20000里程碑,性能=营业收入* 1.0

如果收入达到30000里程碑,性能=营业收入* 1.1

所以最终的性能应尽可能遵循

Date, Revenue, Performance 
'2017-01-01', 7000, 7000 
'2017-01-02', 22000, 24200 
'2017-01-03', 33000, 39600 
'2017-01-04', 46000, 59800 
'2017-01-05', 50000, 65000 

我可以知道如何为匹配设置查询吗?由于

[编辑修改措辞]

+0

不是很清楚你在这里需要什么,我会建议加入销售与评级,但没有一个明确的解释'介于20000和30000之间'应该在这两个表之间。 –

+0

评级表是指里程碑。如果收入达到20000里程碑,性能=收入* 1.1。如果收入达到30000,则表现=收入* 1.2 – user2434918

回答

1

两个最简单的方式来实现这一目标是在你的SELECT语句子查询或外部应用。例如:

SELECT S.[Date], 
     S.Revenue, 
     Performance = S.Revenue * COALESCE((SELECT TOP 1 R.Percentage FROM #Rating AS R WHERE R.Revenue <= S.Revenue ORDER BY R.Revenue DESC), 1) 
FROM #Sales S; 

或者......

SELECT S.[Date], 
     S.Revenue, 
     Performance = S.Revenue * COALESCE(R.Percentage, 1) 
FROM #Sales S 
OUTER APPLY (SELECT TOP 1 R.Percentage FROM #Rating AS R WHERE R.Revenue <= S.Revenue ORDER BY R.Revenue DESC) AS R; 

注意:您很可能使用MAX(R.Percentage)代替TOP 1(留出的ORDER BY R.Revenue DESC也一样),因为它是不可能的百分比会下降与收入增加。

0

试试这个:

Select S.Date 
     ,S.Revenue 
     ,( (Select Max(R.Percentage) 
      From Rating R 
      Where S.Revenue < R.Revenue) 
     * S.Revenue) as Performance 
From Sales S 
+0

由于收入较大,因此它不起作用并在4月1日和5月1日返回记录空值 – user2434918

0

首先得到性能评估表的方式,使得每个记录范围和相应的评级。 然后根据性能范围加入销售数据并计算最终性能。

with 
RangePerformance as 
( 
select lag(Revenue, 1, 0) over (order by Revenue) LowVal, Revenue HighVal, Percentage 
from Rating 
) 
select sales.Date, sales.Revenue, sales.Revenue*RangePerformance.Percentage 
from sales 
join RangePerformance 
on sales.Revenue between RangePerformance.LowVal and RangePerformance.HighVal 

其分解

select lag(Revenue, 1, 0) over (order by Revenue) LowVal, Revenue HighVal, Percentage 
from Rating 

会给你的中间结果集:

0  20000 1.1 
20000 30000 1.2 
30000 40000 1.3 

然后根据属于内的任何销售收入的加盟条件加入这个结果集销售表在上述范围内。

+0

我无法测试它,因为我没有SQL Server 2012或更高版本。但是,如果收入超过40000美元,我认为这是行不通的 – user2434918