如何使用CASE语句应用于与列中特定字段对应的所有值?
例如,我希望每列中的所有付款都显示为否定,但这仅适用于第一列。此外,我希望它适用于每一栏中的所有付款。
CASE WHEN ardoc.DocType = 'PA'
THEN arDoc.DocBal*(-1) ELSE ardoc.DocBal
END AS [Document Balance]
注意:'PA'代表付款
答案 0 :(得分:2)
您不能编写将返回多个列的单个CASE表达式。您需要为每列编写单独的CASE。
答案 1 :(得分:1)
在这种情况下,您可以避免使用类似
的内容重复表达式SELECT DocBal = multiplier * DocBal,
Col2 = multiplier * Col2,
Col3 = multiplier * Col3
FROM arDoc
CROSS APPLY (VALUES(IIF(DocType = 'PA', -1, 1))) V(multiplier);
答案 2 :(得分:0)
正如Tab Allerman所说,你不能用一个CASE声明做到这一点,但可能还有另一种方法。
创建一个包含DocType和乘数的表(临时或永久),然后加入到此。
像
这样的东西DECLARE @t TABLE(DocType varchar(2), multiplier int)
INSERT INTO @t VALUES
('PA', -1),
('XX', 1),
('YY', 1)
然后你的查询看起来像
SELECT
arDoc.DocBal * ISNULL(t.Multiplier, 1) as [Document Balance],
myNextColumn * ISNULL(t.Multiplier, 1) as [My Next Output Column]
From MyTable a
LEFT JOIN @t t on a.DocType = t.DocType
我在这里做了一个左连接并使用了ISNULL,这样如果在@t中找不到任何条目,那么它假定乘数为1.
您仍然需要执行每一列,但代码更小,如果您需要新的乘数,则无需更改案例陈述。