2016-12-24 39 views
0

美好的一天。我有一个脚本查看表格,并对列[vCheck]执行一些逻辑。逻辑运行不正常。表A粘贴在下面。如何通过每行的Case语句设置一个值

如果条件为真,则声明应该将该关联行设置为0.它当前将同一个typeCol的所有关联行设置为0.我如何根据groupid按顺序个性化每行的条件为vCheck设置唯一值?我尝试使用游标方法,IF,而表变量,并更新,并导致相同的问题。

表A

groupid eventid numid tagVal greaterThan greaterEqThan lessThan lessEqThan equalTo typeCol vCheck activeid actVal 
28  18  9000002 0  NULL  NULL   NULL  NULL  NULL 0  1  70   0 
28  18  9000001 NULL NULL  NULL   105   NULL  NULL 3  1  68   74.9101 
28  18  9001767 NULL NULL  NULL   10   NULL  NULL 3  1  69   9.95535 
9  19  9000002 0  NULL  NULL   NULL  NULL  NULL 0  1  70   0 
9  19  9000001 NULL NULL  NULL   105   NULL  NULL 3  1  68   74.9101 
9  19  9001767 NULL 10   NULL   NULL  NULL  NULL 1  1  69   9.95535 
10  20  9000002 0  NULL  NULL   NULL  NULL  NULL 0  1  70   0 
10  20  9000001 NULL 105   NULL   NULL  NULL  NULL 1  1  68   74.9101 
10  20  9001767 NULL 10   NULL   NULL  NULL  NULL 1  1  69   9.95535 

脚本

DECLARE @nID nvarchar(50) 
SET @nID = '9000001' 

/****************Get all associated eventids with respect to the incoming numid**/ 
;WITH ss 
AS (SELECT 
    a.groupid, 
    a.eventid 
FROM subobjgroup a 
WHERE numid = @nID) 
/****************Get each member of the eventids selected above along with the tag data type, and tagval for each member.*/ 
, 
ss2 
AS (SELECT 
    c.* 

FROM ss b 
INNER JOIN subobjgroup c 
    ON b.eventid = c.eventid 
) 

/**************Check if each member in the groupid and their conditions to each eventid selected are met*/ 
SELECT 
    g.groupid, 
    g.eventid, 
    g.numid, 
    g.tagVal, 
    g.greaterThan, 
    g.greaterEqThan, 
    g.lessThan, 
    g.lessEqThan, 
    g.equalTo, 
    g.typeCol, 
    vCheck = 
      CASE 
      WHEN g.typecol = 0 THEN CASE 
       WHEN g.actval = g.tagval THEN 0 
       ELSE 1 
       END 
      WHEN g.typecol = 1 THEN CASE 
       WHEN g.actval > g.greaterthan THEN 0 
       ELSE 1 
       END 
      WHEN g.typecol = 2 THEN CASE 
       WHEN g.actval >= g.greatereqthan THEN 0 
       ELSE 1 
       END 
      WHEN g.typecol = 3 THEN CASE 
       WHEN g.actval < g.lessthan THEN 0 
       ELSE 1 
       END 
      WHEN g.typecol = 4 THEN CASE 
       WHEN g.actval <= g.lesseqthan THEN 0 
       ELSE 1 
       END 
      WHEN g.typecol = 5 THEN CASE 
       WHEN g.actval = g.equalto THEN 0 
       ELSE 1 
       END 
      ELSE 0 
      END, 
    g.activeid, 
    g.actVal 

FROM ss2 g 
ORDER BY g.eventid 

结果...(记住,最后一列actVal不断变化。你将看到需求,vCheck列有1以外的值。注意所有的vCheck值通过相同的typeCol值链接,而不是唯一地检查每行的条件)

groupid eventid numid tagVal greaterThan greaterEqThan lessThan lessEqThan equalTo typeCol vCheck activeid actVal 
9  19  9000001 NULL NULL  NULL   105   NULL  NULL 3  1  68   96.7658 
9  19  9000002 0  NULL  NULL   NULL  NULL  NULL 0  1  70   1 
9  19  9001767 NULL 10   NULL   NULL  NULL  NULL 1  0  69   10.9553 
10  20  9000001 NULL 105   NULL   NULL  NULL  NULL 1  0  68   96.7658 
10  20  9000002 0  NULL  NULL   NULL  NULL  NULL 0  1  70   1 
10  20  9001767 NULL 10   NULL   NULL  NULL  NULL 1  0  69   10.9553 
28  18  9000001 NULL NULL  NULL   105   NULL  NULL 3  1  68   96.7658 
28  18  9000002 0  NULL  NULL   NULL  NULL  NULL 0  1  70   1 
28  18  9001767 NULL NULL  NULL   10   NULL  NULL 3  1  69   10.9553 

期望的结果....(注意vCheck列和第1行,第4行和第7行。它们基于的条件发生变化,该行得到了实现,并设置为0或1)

groupid eventid numid tagVal greaterThan greaterEqThan lessThan lessEqThan equalTo typeCol vCheck activeid actVal 
9  19  9000001 NULL NULL  NULL   105   NULL  NULL 3  0  68   96.7658 
9  19  9000002 0  NULL  NULL   NULL  NULL  NULL 0  1  70   1 
9  19  9001767 NULL 10   NULL   NULL  NULL  NULL 1  0  69   10.9553 
10  20  9000001 NULL 105   NULL   NULL  NULL  NULL 1  1  68   96.7658 
10  20  9000002 0  NULL  NULL   NULL  NULL  NULL 0  1  70   1 
10  20  9001767 NULL 10   NULL   NULL  NULL  NULL 1  0  69   10.9553 
28  18  9000001 NULL NULL  NULL   105   NULL  NULL 3  0  68   96.7658 
28  18  9000002 0  NULL  NULL   NULL  NULL  NULL 0  1  70   1 
28  18  9001767 NULL NULL  NULL   10   NULL  NULL 3  1  69   10.9553 
+0

可能是我误解了,但case语句已经分别应用于每一行。此外,您的实际结果与您提供的查询不一致。请详细说明您要实现的目标。 – GurV

+0

actVal列不断变化。这是故意的。脚本运行。它查看actVal并根据该行的哪个typeCol来使用比较运算符进行评估。当多行具有相同的typeCol时,脚本将它们全部设置为一个值,而不是每个值进行评估。请查看并比较结果和期望的结果。 – arios

回答

1

我用这个:

with subobjgroup(groupid ,eventid ,numid ,tagVal ,greaterThan ,greaterEqThan ,lessThan ,lessEqThan ,equalTo ,typeCol ,vCheck ,activeid ,actVal) as 
    ( select 28,18,9000002,0,NULL,NULL,NULL,NULL,NULL,0,1,70,0 union all 
     select 28,18,9000001,NULL,NULL,NULL,105,NULL,NULL,3,1,68,74.9101 union all 
     select 28,18,9001767,NULL,NULL,NULL,10,NULL,NULL,3,1,69,9.95535 union all 
     select 9,19,9000002,0,NULL,NULL,NULL,NULL,NULL,0,1,70,0 union all 
     select 9,19,9000001,NULL,NULL,NULL,105,NULL,NULL,3,1,68,74.9101 union all 
     select 9,19,9001767,NULL,10,NULL,NULL,NULL,NULL,1,1,69,9.95535 union all 
     select 10,20,9000002,0,NULL,NULL,NULL,NULL,NULL,0,1,70,0 union all 
     select 10,20,9000001,NULL,105,NULL,NULL,NULL,NULL,1,1,68,74.9101 union all 
     select 10,20,9001767,NULL,10,NULL,NULL,NULL,NULL,1,1,69,9.95535), 
    ss AS (SELECT 
     a.groupid, 
     a.eventid 
    FROM subobjgroup a 
    WHERE numid = 9000001) 
    /****************Get each member of the eventids selected above along with the tag data type, and tagval for each member.*/ 
    , 
    ss2 
    AS (SELECT 
     c.* 

    FROM ss b 
    INNER JOIN subobjgroup c 
     ON b.eventid = c.eventid 
    ) 

    /**************Check if each member in the groupid and their conditions to each eventid selected are met*/ 
    SELECT 
     g.groupid, 
     g.eventid, 
     g.numid, 
     g.tagVal, 
     g.greaterThan, 
     g.greaterEqThan, 
     g.lessThan, 
     g.lessEqThan, 
     g.equalTo, 
     g.typeCol, 
     vCheck = 
       CASE 
       WHEN g.typecol = 0 THEN CASE 
        WHEN coalesce(g.actval, 0) = coalesce(g.tagval, 0) THEN 0 
        ELSE 1 
        END 
       WHEN g.typecol = 1 THEN CASE 
        WHEN g.actval > g.greaterthan THEN 0 
        ELSE 1 
        END 
       WHEN g.typecol = 2 THEN CASE 
        WHEN g.actval >= g.greatereqthan THEN 0 
        ELSE 1 
        END 
       WHEN g.typecol = 3 THEN CASE 
        WHEN g.actval < g.lessthan THEN 0 
        ELSE 1 
        END 
       WHEN g.typecol = 4 THEN CASE 
        WHEN g.actval <= g.lesseqthan THEN 0 
        ELSE 1 
        END 
       WHEN g.typecol = 5 THEN CASE 
        WHEN coalesce(g.actval, 0) = coalesce(g.equalto, 0) THEN 0 
        ELSE 1 
        END 
       ELSE 0 
       END, 
     g.activeid, 
     g.actVal 

    FROM ss2 g 
    ORDER BY g.eventid 

和正确的结果,根据您的数据。 vCheck不是因为typecol是1而来的,而是因为数据是这样的。

groupid eventid numid tagVal greaterThan greaterEqThan lessThan lessEqThan equalTo typeCol vCheck activeid actVal 
28  18  9000002 0  NULL  NULL   NULL  NULL  NULL 0  0  70   0,00000 
28  18  9000001 NULL NULL  NULL   105   NULL  NULL 3  0  68   74,91010 
28  18  9001767 NULL NULL  NULL   10   NULL  NULL 3  0  69   9,95535 
9  19  9000002 0  NULL  NULL   NULL  NULL  NULL 0  0  70   0,00000 
9  19  9000001 NULL NULL  NULL   105   NULL  NULL 3  0  68   74,91010 
9  19  9001767 NULL 10   NULL   NULL  NULL  NULL 1  1  69   9,95535 
10  20  9000002 0  NULL  NULL   NULL  NULL  NULL 0  0  70   0,00000 
10  20  9000001 NULL 105   NULL   NULL  NULL  NULL 1  1  68   74,91010 
10  20  9001767 NULL 10   NULL   NULL  NULL  NULL 1  1  69   9,95535 
+0

您的方法有效。谢谢。 – arios