美好的一天。我有一个脚本查看表格,并对列[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
可能是我误解了,但case语句已经分别应用于每一行。此外,您的实际结果与您提供的查询不一致。请详细说明您要实现的目标。 – GurV
actVal列不断变化。这是故意的。脚本运行。它查看actVal并根据该行的哪个typeCol来使用比较运算符进行评估。当多行具有相同的typeCol时,脚本将它们全部设置为一个值,而不是每个值进行评估。请查看并比较结果和期望的结果。 – arios