I've this hard SQL pivot table I'm trying to solve. I can't find the solution for it.
with cte as (
select nationality, class as n
from Fifaklasse
group by nationality
)
select nationality,
coalesce(sum(case when n = 'Wereldklasse' then n end), 0) as 'Wereldklasse',
coalesce(sum(case when n = 'Topklasse' then n end), 0) as 'Topklasse',
coalesce(sum(case when n = 'Subtop' then n end), 0) as 'Subtop'
from cte
group by nationality
| player | nationality | Class |
|---|---|---|
| Messi | n1 | World_class |
| Aguero | n1 | World_class |
| Vidal | n2 | Top_class |
| Pinto | n3 | Subtop_class |
| Ronaldo | n3 | World_class |
| Suarez | n4 | World_class |
| Falcao | n4 | Top_class |
RESULT
| Nationality | World_class | Top_class | Subtop_class |
|---|---|---|---|
| n1 | 2 | 0 | 0 |
| n2 | 0 | 1 | 0 |
| n3 | 1 | 0 | 1 |
| n4 | 1 | 1 | 0 |
CodePudding user response:
You should be summing the value 1 to obtain the counts. That aside, I would use this version with boolean expressions:
SELECT nationality,
SUM(class = 'Wereldklasse') AS Wereldklasse,
SUM(class = 'Topklasse') AS Topklasse,
SUM(class = 'Subtop') AS Subtop
FROM Fifaklasse
GROUP BY nationality;
CodePudding user response:
Tim is correct. But to make it more understandable and work for most other database engines, this should be rewritten as
SELECT nationality,
SUM(iif(klass = 'World', 1, 0)) AS Wereldklasse,
SUM(iif (klass = 'Top', 1, 0)) AS Topklasse,
SUM(iif (klass = 'Subtop', 1, 0)) AS Subtop
FROM Fifaklass
GROUP BY nationality
