[英]'OR' condition in the CASE STATEMENT in stored procedure
I wanted to know if it is possible to have a condition like: 我想知道是否有可能发生以下情况:
((CASE WHEN (a = 1 AND b = 1) OR c = 0 THEN xyz ELSE 0))
I could see lot of CASE with AND but with no OR. 我可以看到很多用AND而不用OR编写的CASE。
And one more thing is this is need for a SELECT query like 还有一件事是,需要像这样的SELECT查询
Select x,y,z, SUM(( CASE WHEN .....))
from table. 从表。
Any help will be appreciated 任何帮助将不胜感激
CREATE PROCEDURE abc
@sid int
AS
BEGIN
SELECT
Column1,
Column2,
Column3,
SUM((CASE WHEN ((a = 1 AND b != 0 ) OR (c = 720)) THEN Amount ELSE 0 END))
AS total
FROM view
WHERE sid = @sid
END
I've not been able to test this, but what you need is the following. 我无法对此进行测试,但是您需要执行以下操作。 There may be a smarter way of writing this.
可能有一种更聪明的编写方式。
SELECT
Column1,
Column2,
Column3,
SUM(NewAmount) AS TOTAL
FROM
SELECT
Column1,
Column2,
Column3,
CASE
WHEN (a = 1 AND b != 0 ) OR c = 720 THEN Amount
ELSE 0
END
AS NewAmount
FROM
view
GROUP BY
Column1,
Column2,
Column3
This should work: 这应该工作:
Select
Column1,
Column2,
Column3,
Sum(
Case
When ( ( a = 1 ) And ( b != 0 ) ) Or ( c = 720 ) Then Amount
Else 0
End
) As total
From
view
Where
sid = ...
Group By
Column1, Column2, Column3
if a, b and c are numbers. 如果a,b和c是数字。
If you want readable solution you could avoid using multiple statement and a lot of round brackets. 如果您想要可读的解决方案,则可以避免使用多个语句和很多圆括号。
CASE WHEN A OR B OR C THEN amount
ELSE 0
END
<=>
CASE WHEN A THEN amount -- this condition will be evalued first
WHEN B THEN amount -- second
WHEN C THEN amount -- and third
ELSE 0
END
In your case: 在您的情况下:
CREATE PROCEDURE abc
@sid int
AS
BEGIN
SELECT
Column1,
Column2,
Column3,
[total] = SUM(CASE
WHEN c = 720 THEN Amount
WHEN a = 1 AND b != 0 THEN Amount
ELSE 0
END)
FROM view
WHERE sid = @sid
GROUP BY Column1, Column2, Column3
END
Note that you need to use GROUP BY
for columns that aren't wrapped with aggregation functions. 请注意,对于未使用聚合函数包装的列,您需要使用
GROUP BY
。
CREATE FUNCTION [dbo].[abc](@sid int) RETURNS TABLE AS RETURN ( SELECT Column1, Column2, Column3, [total] = SUM(CASE WHEN c = 720 THEN Amount WHEN a = 1 AND b != 0 THEN Amount ELSE 0 END) FROM view WHERE sid = @sid GROUP BY Column1, Column2, Column3 );
Then I could do whatever I want with resultset: 然后,我可以使用结果集做任何我想做的事情:
SELECT * FROM [dbo].[abc](1) WHERE Column1 = 'xxx'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.