Reputation: 185
Good day. I have a script that looks at a table and performs some logic against a column [vCheck]
. The logic is not working correctly. Table A is pasted below.
If a condition is true, the statement is supposed to set that associated row to 0. It currently sets all associated rows of that same typeCol
to 0. How do I individualize each rows' condition with respect to the groupid in order to have unique values for vCheck
? I tried using the cursor method, IF's, while, table variables, and update and that led to the same issue.
Table 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
The script
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
The results... (keep in mind, the last column actVal constantly changes. You will see the vCheck column have values other than 1. Notice all vCheck values are linked by the same typeCol value instead of uniquely checking each rows condition)
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
The desired results.... (notice vCheck column and the 1st, 4th, and 7th row. They are changed based on the condition and that row got effected and was set to 0 or 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
Upvotes: 0
Views: 1785
Reputation: 39457
I used this:
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
and correct result based on your data. vCheck
is not coming 1 just because typecol
is 1, but because data is like so.
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
Upvotes: 1