如何正确使用SQL CASE语句

时间:2017-07-21 12:21:19

标签: sql-server ssrs-2012

如何使用CASE语句应用于与列中特定字段对应的所有值?

例如,我希望每列中的所有付款都显示为否定,但这仅适用于第一列。此外,我希望它适用于每一栏中的所有付款。

 CASE WHEN ardoc.DocType = 'PA' 
      THEN arDoc.DocBal*(-1) ELSE ardoc.DocBal 
 END AS [Document Balance]

注意:'PA'代表付款

3 个答案:

答案 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.

您仍然需要执行每一列,但代码更小,如果您需要新的乘数,则无需更改案例陈述。