我在SQL编码方面相对较新,对案例陈述有疑问。
我要实现的目标:我想创建一个用于计算正确的过时规定的查询。
为此,我需要创建一个名为6
的列和一个名为result
的列。将计算两个字段。
字段贬值类别中的结果取决于库存范围的计算。即根据库存达到的程度确定贬值类别。例如。如果Inventory Reach
大于9,则贬值等级为1(100%)。当执行下面的代码时,我收到以下错误消息:
无效的列名“广告资源覆盖面”。
所以对我来说,似乎第二个case语句失败,并且与第一个case语句挂在一起。但是我很难找到答案,这是什么问题。如果有人可以将一些光带入黑暗,我将不胜感激。
提前谢谢
Devaluation Class
答案 0 :(得分:1)
您无权访问同一select子句中select子句中的别名。有一个简单的修复程序,它使用派生表或公共表表达式:
;with cte as
(
Select
[Material]
,[Plnt]
,case
when [calculate 5-year demand] = 0
then 9.01
when [BAAS SO GI (601) 36] = 0
then 9.01
when [MS] <> 'BI' or [MS] <> 'BO'
then ([Stock all SP WH]/([calculate 5-year demand]/5))
when [MS] = 'BO'
then ([Stock all SP WH]/[BAAS SO GI (601) 36])
when [MS] ='BI'
then 0
else 9.01
end as [Inventory Reach]
from [BAAS_PowerBI].[dbo].[Obs]
)
select [Material]
,[Plnt]
,[Inventory Reach]
,case
when [Inventory Reach] > 9
then 1
else 0.9
end as [Devaluation Class]
from cte
上面的代码使用的是公共表表达式,在此方案中,它与使用派生表基本相同,但可读性更高。这是等效的派生表:
select [Material]
,[Plnt]
,[Inventory Reach]
,case
when [Inventory Reach] > 9
then 1
else 0.9
end as [Devaluation Class]
from
(
Select
[Material]
,[Plnt]
,case
when [calculate 5-year demand] = 0
then 9.01
when [BAAS SO GI (601) 36] = 0
then 9.01
when [MS] <> 'BI' or [MS] <> 'BO'
then ([Stock all SP WH]/([calculate 5-year demand]/5))
when [MS] = 'BO'
then ([Stock all SP WH]/[BAAS SO GI (601) 36])
when [MS] ='BI'
then 0
else 9.01
end as [Inventory Reach]
from [BAAS_PowerBI].[dbo].[Obs]
) derived
答案 1 :(得分:1)
FROM
,WHERE
,GROUP BY
或HAVING
子句中不允许使用列别名。您可以使用子查询或CTE,但SQL Server通过APPLY
关键字支持横向联接。这对于引入列别名非常有用:
select o.Material, o.Plnt, v.[Inventory Reach],
(case when v.[Inventory Reach] > 9
then 1
else 0.9
end) as [Devaluation Class]
from [BAAS_PowerBI].[dbo].[Obs] o cross apply
(values (case when o.[calculate 5-year demand] = 0
then 9.01
when o.[BAAS SO GI (601) 36] = 0
then 9.01
when o.[MS] in ('BI', 'BO')
then (o.[Stock all SP WH] / (o.[calculate 5-year demand] / 5))
when o.[MS] = 'BO'
then (o.[Stock all SP WH] / o.[BAAS SO GI (601) 36])
when o.[MS] ='BI'
then 0
else 9.01
end
)
) values([Inventory Reach])