链接的2个案例陈述

时间:2019-02-15 09:55:07

标签: sql tsql

我在SQL编码方面相对较新,对案例陈述有疑问。

我要实现的目标:我想创建一个用于计算正确的过时规定的查询。

为此,我需要创建一个名为6的列和一个名为result的列。将计算两个字段。

字段贬值类别中的结果取决于库存范围的计算。即根据库存达到的程度确定贬值类别。例如。如果Inventory Reach大于9,则贬值等级为1(100%)。当执行下面的代码时,我收到以下错误消息:

  

无效的列名“广告资源覆盖面”。

所以对我来说,似乎第二个case语句失败,并且与第一个case语句挂在一起。但是我很难找到答案,这是什么问题。如果有人可以将一些光带入黑暗,我将不胜感激。

提前谢谢

Devaluation Class

2 个答案:

答案 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)

FROMWHEREGROUP BYHAVING子句中不允许使用列别名。您可以使用子查询或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])