sql - 具有变量低效率的 SQL Server 双案例语句
问题描述
这可能只是不知道要搜索什么的情况,因此具有该方向的答案是完全可以接受的。我正在将数据推送到我的 SQL 服务器并具有以下(模拟),它有效,但似乎效率很低。我最终宁愿消除我所有的变量。
--From PHP
declare @employeeid varchar(25) = '100971'
declare @reviewscore as tinyint = 52
declare @payclass as varchar(25) = 'salary management'
--/From PHP
declare @wagequartile as tinyint = (select quartile from activeemployees where EmployeeID= @employeeid)
declare @scorequartile as tinyint = (
select
case
when @reviewscore <= max1 then 1
when @reviewscore <= max2 then 2
when @reviewscore <= max3 then 3
else 4
end as ScoreQuartile
from ReviewScoreMatrix where PayClass=@payclass
)
select
case
when @scorequartile = 1 then ScoreQuartile1
when @scorequartile = 2 then ScoreQuartile2
when @scorequartile = 3 then ScoreQuartile3
else 4
end as PercentRaise
from RaisePercentMatrix
where WageQuartile = @wagequartile
我尝试使用 CTE,但无法弄清楚它是如何让它变得更好的。相关部分:
with cte1 as (
select
case
when @reviewscore <= max1 then 1
when @reviewscore <= max2 then 2
when @reviewscore <= max3 then 3
else 4
end as [ScoreQuartile]
from ReviewScoreMatrix where PayClass=@payclass
)
select
case
when (select top 1 ScoreQuartile from cte1) = 1 then ScoreQuartile1
when (select top 1 ScoreQuartile from cte1) = 2 then ScoreQuartile2
when (select top 1 ScoreQuartile from cte1) = 3 then ScoreQuartile3
else 4
end as PercentRaise
from RaisePercentMatrix
where WageQuartile = @wagequartile
我觉得我在 CTE 上走在了正确的轨道上,但是从 cte1 嵌入选择似乎在那里错过了。任何帮助表示赞赏。
解决方案
如果我正确传输,那么您的代码可以变成这样:
declare
@employeeid varchar(25) = '100971',
@reviewscore as tinyint = 52,
@payclass as varchar(25) = 'salary management';
select PercentRaise =
case
when @reviewScore <= rsm.max1 then rpm.ScoreQuartile1
when @reviewScore <= rsm.max2 then rpm.ScoreQuartile2
when @reviewScore <= rsm.max3 then rpm.ScoreQuartile3
else 4
end
from activeEmployees e
join raisePercentMatrix rpm on e.quartile = rpm.wageQuartile
left join reviewScoreMatrix rsm on rsm.payClass = @payclass
where e.EmployeeID = @employeeid;
但是,如果您在某个地方有一个审查分数表和每个员工的工资等级分配表,那么您可以查询所有员工:
select e.employeeId,
PercentRaise =
case
when rs.reviewScore <= rsm.max1 then rpm.ScoreQuartile1
when rs.reviewScore <= rsm.max2 then rpm.ScoreQuartile2
when rs.reviewScore <= rsm.max3 then rpm.ScoreQuartile3
else 4
end
from activeEmployees e
join reviewScores rs on e.employeeId = rs.employeeId
join payClassInfo pci on e.employeeId = pci.employeeId
join raisePercentMatrix rpm on e.quartile = rpm.wageQuartile
left join reviewScoreMatrix rsm on rsm.payClass = pci.payclass;
推荐阅读
- marklogic-10 - 使用 cts:near-query 突出显示查询
- docker - 纯粹用于前端文件的 Docker 容器
- magento2 - 如何在 magento 2 结帐时添加通知,在街道地址字段上进行计费和运输
- rethinkdb - RethinkDB:使用键数组连接表
- javascript - 如何在js中将字符串转换为对象中的对象?
- c - 使用 OpenMP 并行化程序以确保其可以扩展以有效利用现代多核处理器的最佳方式
- python - Keras 模型的输入数组的形状有什么问题?
- excel - Excel 多维数据集公式:在 CUBESET 中使用多个过滤器进行过滤
- r - 使用R在文件夹中的所有excel文件(以及excel文件中的所有工作表)中写入一个新列
- docker - 关于 typed_config http 连接管理器的 envoy v3 的非法映射值