2016-01-08 3 views
0

Я хотел бы знать, если это возможно, чтобы иметь состояние, как:«OR» условие в сазе в хранимой процедуре

((CASE WHEN (a = 1 AND b = 1) OR c = 0 THEN xyz ELSE 0)) 

я мог видеть много СЛУЧАЙ с AND, но без OR.

И еще одна вещь это нужно для запроса SELECT, как

Select x,y,z, SUM((CASE WHEN .....)) 

из таблицы.

Любая помощь будет оценена

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 
+0

Почему бы вам не попробовать это сами? Это выглядит синтаксически правильным для меня. Также, пожалуйста, сообщите нам, какие RDBMS вы используете. –

+0

Я попробовал, но, к сожалению, результат не тот, который я ожидал. Iam using MSSQL – arunsankarkk

+3

Пожалуйста, покажите нам полный запрос, отформатированный читаемым способом (с каждой строкой, имеющей 4 пробела спереди), а также с точной выводом ошибки. –

ответ

0

Я не был в состоянии проверить это, но то, что вам нужно, это следующее. Там может быть умнее способ написания этого.

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 
0

Это должно работать:

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 

если а, Ь и с числами.

0

Если вы хотите читаемое решение, вы можете избежать использования нескольких операторов и множества круглых скобок.

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 

В вашем случае:

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 

Обратите внимание, что вам нужно использовать GROUP BY для столбцов, которые не обернутых с функциями агрегирования.


Вторая вещь, которую я хотел бы использовать user defined table valued function вместо хранимой процедуры:

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 
); 

Тогда я мог бы делать все, что я хочу с результирующем:

SELECT * 
FROM [dbo].[abc](1) 
WHERE Column1 = 'xxx' 
Смежные вопросы