'How do I "Rotate" a set of results from rows into columns for users in various groups

I'm running MySQL 5.7.

I'm looking for a SQL query that will "rotate" some data from rows into columns. The tables are like so:

users table

user_id,first_name
1,Alice
2,Bob
3,Eve
4,Mallory

user_groups table

user_id,group_name
1,Administrator
2,Editor
2,Contributor
3,Viewer

There are a finite, small set of groups, and I want to produce a result like:

user_id,first_name,Administrator,Editor,Contributor,Viewer
1,Alice,Yes,No,No,No
2,Bob,No,Yes,Yes,No
3,Eve,No,No,No,Yes
4,Mallory,No,No,No,No

I'm not even sure what I would call that kind of query, but that's what I'd like to do. "Yes" and "No" can be 0 and 1, or NULL and 1, that's all fine.

Any ideas?



Solution 1:[1]

SELECT u.user_id,
 MAX(CASE group_name WHEN 'Administrator' THEN 'Yes' ELSE 'No' END) AS Administrator,
 MAX(CASE group_name WHEN 'Editor' THEN 'Yes' ELSE 'No' END) AS Editor,
 MAX(CASE group_name WHEN 'Contributor' THEN 'Yes' ELSE 'No' END) AS Contributor,
 MAX(CASE group_name WHEN 'Viewer' THEN 'Yes' ELSE 'No' END) AS Viewer
FROM users AS u
LEFT OUTER JOIN user_groups AS g USING (user_id)
GROUP BY u.user_id;

MySQL does not have support for any special syntax for PIVOT or CROSSTAB as some other brands of SQL database have.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Bill Karwin