我正在尝试计算一个字段。例如
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')
答案 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');
我在行级别进行了计算。我希望这正是你所寻找的。 p>
-- 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)的所有组合,为什么不在模式匹配之前转换为小写字符串?
结果查询结果如下。
值得思考,如果您在一天中多次运行此查询,您可能希望拥有一个持久的计算字段。
查看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')