Skip to content

Instantly share code, notes, and snippets.

@OrenBochman
Last active November 13, 2018 07:55
Show Gist options
  • Save OrenBochman/41e41fed44993f6e8224e3e3edf0e19d to your computer and use it in GitHub Desktop.
Save OrenBochman/41e41fed44993f6e8224e3e3edf0e19d to your computer and use it in GitHub Desktop.
sql reshaping: converting a narrow triplets store to a wide table and combining related attributes and concatenating multiple entries within cells

SQL reshaping:

  • converting a narrow triplets store to a wide table and combining related attributes and concatenating multiple entries within cells

What happening in the first solution:

  • we create a row per country via group by.
  • then we create each column by an aggragate on a case.
  • the case could be eliminated using a sub query
  • also we concat result using a mysql extension GROUP_CONCAT() or PostgreSQL, SQL Server 2017 and Azure SQL ext STRING_AGG()

Refrences:

-- schema
CREATE TABLE triplets (
id INT NOT NULL AUTO_INCREMENT,
country VARCHAR(35),
attr VARCHAR(35),
val VARCHAR(35),
PRIMARY KEY(Id)
);
INSERT INTO triplets
(country,attr, val)
VALUES
("US","President","Obama" ),
("US","Currency","Dollar"),
("US","Capitol City","Washington DC"),
("China","President","Hu"),
("China","Currency","Yuan"),
("China","Capitol City","Bejing"),
("Israel","Currency","Shekel"),
("Israel","President","Peres"),
("Israel","Capitol City","Jerusalem"),
("Israel","Language","Hebrew"),
("Israel","Language","Arabic"),
("Israel","Capitol City","Tel Aviv"),
("China","Language","Cantoneese"),
("China","Language","Mandarin"),
("US","Language","English"),
("Japan","Language","Japaneese"),
("Japan","Currency","Yen"),
("Japan","Capitol City", "Tokyo"),
("UK","Language", "English"),
("UK","Currency", "Pound"),
("UK","Capitol City", "London"),
("UK","Monarch", "Elizabeth II"),
("UK","Prime Minister", "Theresa May"),
("Japan","Emperor", "Akihito"),
("Japan","Prime Minister", "Shinzō Abe"),
("Israel","Prime Minister", "Binyamin Netanyahu")
;
SELECT Country,
GROUP_CONCAT(CASE WHEN attr IN ("President","Prime Minister","Monarch","Emperor") THEN val ELSE NULL END) as Leader,
MAX(CASE WHEN attr = "Currency" THEN val ELSE NULL END) as Currency,
GROUP_CONCAT(CASE WHEN attr = "Capitol City" THEN val ELSE NULL END) as Capitol,
GROUP_CONCAT(CASE WHEN attr = "Language" THEN val ELSE NULL END) as Lang
FROM triplets
GROUP BY country
ORDER BY country;
;
SELECT *
FROM triplets
ORDER BY country;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment