如果是,则基于CASE的SQL字段计算

时间:2013-09-06 17:27:06

标签: sql sql-server field calculated-columns

我正在尝试计算一个字段。例如

select **sum(New)** as NewCST where WHERE PO ='L22411301' AND ItemNo IN('1730','1343').

而不是总和,我有整个案例陈述来实现。我还没有完成具有这么多条件的公式计算。所以任何帮助都表示赞赏。

到目前为止,我得到了这个:

SELECT *
FROM (SELECT 
    Case
        When  PO_SIZE like ‘%lb%’ Then  CONVERT(decimal(13,4), NET_COST / TOTAL_WEIGHT)
        When PO_SIZE like ‘%LB%’ Then  CONVERT(decimal(13,4), NET_COST / TOTAL_WEIGHT)
        Else  CONVERT(decimal(13,4), ADJ_EXT_NET_COST / LINE_QUANTITY)        
from [FirstStrike_Retail].[custom].[Whse_Line_Item] )End AS NewCst.
WHERE PO ='L22411301' AND ItemNo IN('1730','1343')

3 个答案:

答案 0 :(得分:3)

不需要外部选择语句。此外,在进入CASE子句之前,您需要使用END关键字关闭FROM语句。

以下是您的代码的整理版本。

SELECT  Case    When PO_SIZE like ‘%lb%’ Then  CONVERT(decimal(13,4), NET_COST / TOTAL_WEIGHT)
                When PO_SIZE like ‘%LB%’ Then  CONVERT(decimal(13,4), NET_COST / TOTAL_WEIGHT)
                Else  CONVERT(decimal(13,4), ADJ_EXT_NET_COST / LINE_QUANTITY)
        End AS NewCst
from    [FirstStrike_Retail].[custom].[Whse_Line_Item] )
WHERE   PO ='L22411301' 
AND     ItemNo IN('1730','1343')

答案 1 :(得分:1)

第一个解决方案肯定有语法错误。我想我要问的是你想要在行级(declan_k)或分组级别(sonam)进行计算。

但是,上述代码(解决方案)中存在一些冗余。此外,PO_SIZE的“Lb”将无法正确计算。

让我们玩得开心!

我总是喜欢在做这些答案时创建一个示例数据库。

-- Sample table
CREATE TABLE #WHSE_LINE_ITEM
(
  ITEM_ID INT,
  PO_NUM VARCHAR(10),
  ITEM_NUM VARCHAR(10),
  NET_COST REAL,
  ADJ_EXT_NET_COST REAL,
  LINE_QUANTITY INT,
  TOTAL_WEIGHT REAL,
  PO_SIZE VARCHAR(10)
);

-- Sample data
INSERT INTO #WHSE_LINE_ITEM
VALUES
(1, 'L22411301', '1730', 200.00, 0.0, 3.0, 15.0, 'LB'),
(2, 'L22411301', '1730', 150.00, 0.0, 3.0, 30.0, 'lb'),
(3, 'L22411301', '1343', 100.00, 0.0, 4.0, 0.0, 'LN');

我在行级别进行了计算。我希望这正是你所寻找的。

-- Calculate field using case stmt
SELECT 
  CASE
    WHEN (LOWER(PO_SIZE) like '%lb%') THEN 
        CAST((NET_COST / TOTAL_WEIGHT) AS DECIMAL (13,4))
    ELSE
        CAST((NET_COST / LINE_QUANTITY) AS DECIMAL (13,4))
  END AS NEWCST, 
  *
FROM 
  #WHSE_LINE_ITEM
WHERE 
  PO_NUM = 'L22411301' AND 
  ITEM_NUM IN('1730','1343');

在查看代码时,我总是尝试将大小减小到最小。如果您正在测试磅(Lb,lB,lb或LB)的所有组合,为什么不在模式匹配之前转换为小写字符串?

结果查询结果如下。

enter image description here

值得思考,如果您在一天中多次运行此查询,您可能希望拥有一个持久的计算字段。

查看2012年的MSDN entry。这样可以避免引擎每次都计算字段,但代价是将结果存储在磁盘上。

答案 2 :(得分:0)

select 
   sum(Case When  PO_SIZE like ‘%lb%’ Then  CONVERT(decimal(13,4), NET_COST / TOTAL_WEIGHT)
   When PO_SIZE like ‘%LB%’ Then  CONVERT(decimal(13,4), NET_COST / TOTAL_WEIGHT)
   Else  CONVERT(decimal(13,4), ADJ_EXT_NET_COST / LINE_QUANTITY)END)NewCst 
from 
   [FirstStrike_Retail].[custom].[Whse_Line_Item] 
WHERE 
   PO ='L22411301' AND ItemNo IN('1730','1343')