Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据另一个表中的评级计算绩效_Sql_Sql Server - Fatal编程技术网

Sql 根据另一个表中的评级计算绩效

Sql 根据另一个表中的评级计算绩效,sql,sql-server,Sql,Sql Server,有一个每天有收入的销售表和另一个用于根据收入里程碑计算绩效的评级表 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 CREAT

有一个每天有收入的销售表和另一个用于根据收入里程碑计算绩效的评级表

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
我可以知道如何设置匹配的查询吗?谢谢


[编辑以修改措辞]

实现这一点的两种最简单的方法是在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;
或者

注意:您可能会使用MAXR.Percentage,而不是TOP 1,因为百分比不太可能随着收入的增加而下降

试试这个:

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

首先,以这样一种方式获取性能评级表:每个记录都有范围和相应的评级。 然后根据绩效范围加入销售数据并计算最终绩效

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

然后,根据上述集合中任何范围内的销售收入的联接条件,将此结果集联接到销售表中

我不太清楚你需要什么,我建议你加入销售与评级,但没有一个明确的解释,20000和30000之间的关联应该在两个表之间。评级表指的是里程碑。如果收入达到20000里程碑,绩效=收入*1.1。如果收入达到30000,performance=revenue*1.2它将不起作用,并在1月4日和5日为记录返回NULL,因为收入较大,我无法测试它,因为我没有SQL Server 2012或更高版本。但我认为,如果收入超过4万英镑,这是行不通的
0     20000 1.1
20000 30000 1.2
30000 40000 1.3