有没有一种方法可以基于其他多个列来计算SQL中的动态列

时间:2020-09-26 23:37:56

标签: sql sql-server

我试图确定是否可以在SQL中做一些事情来为用户创建视图,并且我需要创建一列来说明行号是“打开”还是“关闭”。问题在于确定该值的过程是基于源表中其他列的多个因素/值。查看视图当前生成的一些数据。

Line #  Req_Qty  Rej_Qty     Adj_Qty    Alt_Qty Shipped Cxl     Rec     Conf
Line 1  71.00    0.00        100.00     0.00    100.00  0.00    100.00  100.00  
Line 2  23.00    0.00        0.00       0.00    23.00   0.00    0.00    0.00    
Line 3  11.00    0.00        10.00      0.00    10.00   0.00    0.00    0.00    
Line 4  12.00    12.00       0.00       0.00    0.00    0.00    0.00    0.00    
Line 5  0.00     0.00        0.00       20.00   20.00   0.00    0.00    0.00

在上面的表格中,确定方法如下: 如果Adj_Qty中的任何值均大于0,则Adj_Qty(已调整数量)实际上将成为Req_Qty(请求数量)。如果Req_Qty和Adj_Qty均为0并且Alt_Qty> 0,则现在成为实际的Req_数量。所以基本上,我的第一个比较是Adj-> Req-> Alt。无论数量多少,都将减少Rej_Qty(已拒绝)或Cxl_Qty(已取消),从而产生余额。

最后,如果Rec或Conf列中的数量与该余额匹配,则行#将关闭。因此,对于表,第1行和第4行将关闭,第2行,第3行和第5行将打开。有什么方法可以在SQL中创建一个字段/列,该字段/列可以根据这种逻辑类型分配“打开”或“关闭”?

1 个答案:

答案 0 :(得分:1)

您可以使用CASE子句来计算视图中的余额和状态。例如:

create view v as
select *,
  case when (
    case when adj_qty > 0 then adj_qty
         when req_qty > 0 then req_qty
         when alt_qty > 0 then alt_qty
         else 0.0
    end
    - rej_qty
    - cxl_qty
    ) in (rec, conf) then 'closed'
       else 'open' end as status
from t

我可能不了解您特定逻辑的所有详细信息,但是此查询应该非常接近您的需求。根据需要进行调整。