I have data that looks like this (note one TRUE per row):
''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|ROWS| very_good | good | neither | poor | very poor |
''''''''''''''''''''''''''''''''''''''''''''''''''''''''
| 1 | TRUE | FALSE | FALSE | FALSE | FALSE |
| 2 | FALSE | TRUE | FALSE | FALSE | FALSE |
| 3 | FALSE | FALSE | FALSE | TRUE | FALSE |
| | | | | | |
I want to replace each TRUE with a number that depends on the column that it is in (5-1), so a score with very_good
being 5 and very_poor
being 1, and then squeeze it into one column. So it looks like this:
''''''''''''''
|ROWS| SCORE |
''''''''''''''
| 1 | 5 |
| 2 | 4 |
| 3 | 2 |
| | |
So far I’ve tried this:
SELECT
,
(REPLACE(CAST(very_good = 'true' AS STRING),'true', '5'),
REPLACE(CAST(good = 'true' AS STRING),'true', '4'),
REPLACE(CAST(neither = 'true' AS STRING),'true', '3'),
REPLACE(CAST(poor = 'true' AS STRING),'true', '2'),
REPLACE(CAST(very_poor = 'true' AS STRING),'true', '1')) AS SCORE,
,
FROM table
But this creates multiple columns and I can’t find a way to do multiple REPLACE’s within a single column, additionally, this doesn’t change the FALSE which needs to be removed. Ideally, I need to deal with some rows being filled with null values as well.
Advertisement
Answer
You can use a case
expression:
select
rows,
case
when very_good = 'true' then 5
when good = 'true' then 4
when neither = 'true' then 3
when poor = 'true' then 2
when very_poor = 'true' then 1
end as score
from mytable
Note that for this to make sense, only one column in each row should be true – otherwise, the case
expression returns the highest scoring column.
The following might also work in Big Query, if the columns are of boolean
datatype:
select
rows,
case
when very_good then 5
when good then 4
when neither then 3
when poor then 2
when very_poor then 1
end as score
from mytable