PostgreSQL - Simple table totaling
Uppgift:
For this challenge you need to create a simple query to display each unique clan with their total points and ranked by their total points.
people table schema
- name
- points
- clan
You should then return a table that resembles below
select on
- rank
- clan
- total_points
- total_people
The query must rank each clan by their total_points, you must return each unqiue clan and if there is no clan name you must replace it with [no clan specified], you must sum the total_points for each clan and the total_people within that clan.
Källa: https://www.codewars.com/kata/sql-basics-simple-table-totaling/train/sql
Min lösning (PostgreSQL 9.6):
select sum(points) as rank, clan, sum(points) as total_points, count(name) as total_people,
CASE
WHEN clan = null THEN '[no clan specified]'
END AS clan
from people
group by clan
order by total_points desc
Output:
Fråga:
Av någon anledning så verkar de tomma rutorna inte ersättas med texten 'no clan specified' i clan-kolumnen. Jag har även testat funktionen coalesce för att skriva in text i de rutor som innehåller null på följande vis:
COALESCE(people.clan,'No clan specified') AS clan
Kan någon se varför? Dessutom bör väl varje rad innehålla en unik klan, men det gör den inte enligt utskriften. Har suttit i flera timmar utan att komma vidare :S
Får följande felmeddelande:
"Test Failedexpected: >= 1401217
got: 225514"
Löste den på följande vis:
SELECT RANK() OVER (ORDER BY SUM(points) DESC), COALESCE(NULLIF(clan,''), '[no clan specified]') AS clan, SUM(points) AS total_points, COUNT(*) AS total_people FROM people GROUP BY clan ORDER BY total_points DESC