SQL在生成字段时从Case中选择

时间:2017-09-28 09:57:23

标签: sql sql-server sql-server-2008

在我的查询中,此字段由此语句生成

CASE WHEN T1.unitMsr='MT' then STR((T1.Quantity),12,5) 
ELSE STR((T1.Quantity*T2.NumInSale),12,5)END as OrderQty,

isnull(str(sum(CASE WHEN TN.unitMsr = 'MT' 
Then TN.Quantity ELSE TN.Quantity*T2.NumInSale END),8,5),'0.00000') as DO_Qty_MT,

在select语句结束之前,我想实现类似这样的东西

Case When DO_Qty_MT >= OrderQty Then 'Normal'
Else 'Abnormal' END
As 'Closing method'

我应该如何用适当的参考代替DO_Qty_MT和OrderQty?

2 个答案:

答案 0 :(得分:0)

在我看来,您将订单设置为"异常"如果总订单数量小于任何订单行..
但只有在T1.QuantityT2.NumInSaleNULL或为负(OrderQty<0时)时,才有可能实现这一点。

从您TN表开始,您只需使用以下方法测试行:

-- get all rows with detailed information and Normal/Abnormal test..
select 
    *, Case When isnull(OrderQty, -1)<0 Then 'Abnormal' Else 'Normal' END As [Closing method]
from  TN

如果只需要&#34;异常&#34;

,那就更简单了
select *, 'Abnormal' As [Closing method]
from  TN
where isnull(OrderQty, -1)<0 

如果您只想在以前的查询中使用distinct YourOrderId而不是*提取包含异常行的订单。

-- get all orders with Normal/Abnormal test
select distinct OrderId, 
    Case When isnull(OrderQty, -1)<0 Then 'Abnormal' Else 'Normal' END As [Closing method]
from  TN

-- get only Abnormal orders
select distinct OrderId, 'Abnormal' As [Closing method]
from  TN
where isnull(OrderQty, -1)<0 

答案 1 :(得分:0)

添加此类&#34;变量的典型方法&#34;是使用CTE或子查询。另一种方法是横向连接,SQL Server支持apply关键字:

select . . ., v.OrderQty,
       coalesce(str(sum(case when TN.unitMsr = 'MT'
                             then TN.Quantity 
                             else TN.Quantity * T2.NumInSale  
                        end), 8, 5
                   ), '0.00000'
               ) as DO_Qty_MT,
from . . . outer apply
     (values (case when T1.unitMsr = 'MT' then str(T1.Quantity, 12, 5) 
                   else str(T1.Quantity * T2.NumInSale, 12, 5)
              end)
     ) v(OrderQty)

这样可以更简单地进行计算链。

另外,我不明白你使用str()的原因。 Decimal / numeric似乎可以执行您想要的操作 - 并将值的表示形式保留为数字而不是字符串