In a survey, a row with the question name 3a
should equal the sum of the responses from the questions with the names 1a
and 2a
. This is the code I have:
UPDATE acrl.ACRLData_Edited_Test
SET question_textvalue =
cast(
(SELECT question_textvalue
FROM acrl.ACRLData_Edited_Test a2
WHERE a2.ipeds_id = a.ipeds_id
and a2.question_name = a.question_name and a2.question_name LIKE '1a.%'
) as decimal(10,2))
cast(
(SELECT question_textvalue
FROM acrl.ACRLData_Edited_Test a2
WHERE a2.ipeds_id = a.ipeds_id
and a2.question_name = a.question_name and a2.question_name LIKE '2a.%'
) as decimal(10,2))
FROM acrl.ACRLData_Edited_Test a
WHERE a.question_name LIKE '3a.%'
But it doesn't seem to work at all. When I run it, the survey responses/rows with the question 3a"
still show Null
, instead of the number.
For example, I have an entry with the 1a
response as 4.7
, the 2a
response as 3.9
and the 3a
response is NULL
. It should be 8.6
in that scenario.
CodePudding user response:
I see this in the nested query in the first case
expression:
a2.question_name = a.question_name and a2.question_name LIKE '1a.%'
and also this in the final WHERE
clause:
a.question_name LIKE '3a.%'
Logically, the a2.question_name = a.question_name
condition means our values must satisfy both the a.question_name
restriction from the main outer WHERE
clause and the a2.question_name
restriction in the inner nested WHERE
clause. It can only match records where the value is both LIKE '3a.%'
and LIKE '1a.%'
. Those things cannot both be true, and therefore all the 3a.%
records will become NULL
even if they weren't before.
The same issue applies to the second case
expression as well.
Also, the .
has specially meaning in a LIKE
match and adds no value here. You may as well use LIKE '3a%'
, LIKE '1a%'
, etc, but LIKE '3a[.] %'
is most exact.
CodePudding user response:
What result are you getting if you run the below select statement?
SELECT a.question_name,
cast(
(SELECT question_textvalue
FROM acrl.ACRLData_Edited_Test a2
WHERE a2.ipeds_id = a.ipeds_id
and a2.question_name = a.question_name and a2.question_name LIKE '1a.%'
) as decimal(10,2)) as SubQuery1,
cast(
(SELECT question_textvalue
FROM acrl.ACRLData_Edited_Test a2
WHERE a2.ipeds_id = a.ipeds_id
and a2.question_name = a.question_name and a2.question_name LIKE '2a.%'
) as decimal(10,2)) as SubQuery2
FROM acrl.ACRLData_Edited_Test a
WHERE a.question_name LIKE '3a.%'
Does any of the two subquery columns return NULL value? If so, try enclosing it with ISNULL( cast(...),0) ISNULL( cast(...),0).