In SQL I have a table with 3 columns:
Month1 | Month2 | Month3 |
---|---|---|
0 | 1 | 0 |
1 | 1 | 1 |
0 | 1 | 1 |
...and so on.
I need another column where it gives the mode of Month1
, Month2
and Month3
.
My expected output is:
Month1 | Month2 | Month3 | Mode |
---|---|---|---|
0 | 1 | 0 | 0 |
1 | 1 | 1 | 1 |
0 | 1 | 1 | 1 |
So far I have only calculated mode for a single column. Not sure how we can do it horizontally by combining 3 columns.
CodePudding user response:
You could use a CASE
expression:
SELECT *, CASE WHEN Month1 Month2 Month3 <= 1 THEN 0 ELSE 1 END AS mode
FROM yourTable;
CodePudding user response:
This should work, can easily be expanded for n columns:
select month1, month2, month3, ca.val
from t
cross apply (
select top 1 val
from (values
(month1),
(month2),
(month3)
) as v(val)
group by val
order by count(*) desc
) as ca
For RDBMS other than SQL server, replace values(...)
with appropriate table value constructor, cross apply
with lateral join/sub query inside select and top 1
with limit/offset...fetch.