2016-12-24 41 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