/ / MySQL Transofrming таблиці до матриці без нульових значень - mysql, sql, matrix, pivot-table

MySQL Transofrming таблиця для матриці без нульових значень - mysql, sql, matrix, pivot-table

У мене є таблиця з країнами та переклади на різних мовах, щось на зразок цього (можливо, деякі дані можуть бути неправильними, але є лише зразковими значеннями):

lanId, countryId, name, translation
1,        1,      Spain,  Spain
1,        2,      France, France
1,        3,      Italy,  Italy
2,        1,      Spain,  España
2,        2,      France, Francia
2,        3,      Italy,  Italia
3,        1,      Spain,  Espagne
3,        2,      France, France
3,        3,      Italy,  Italie

Що мені потрібно отримати, це матриця, яка показує одну колонку для мови, подібну до цього:

countryId, countryName, es,     fr,
1,           spain,    españa,  espagne
2,           france,   francia, france
3,           italy,    italia,  italie

Я спробував скористатися пропозицією CASE:

SELECT countryId,
case WHEN idLan =1 THEN translation  end as en,
case WHEN idLan =2 THEN translation END as es,
case WHEN idLan =3 THEN translation END as fr,
FROM translations

Але я отримую багато NULL у кожному стовпці, як це:

countryId, en,    es,     fr
1,       spain,  NULL,    NULL
2,       france, NULL,    NULL
3,       Italy,  NULL,    NULL
1,       NULL,   españa,  NULL
2,       NULL,   francia, NULL
3,       NULL,   italia,  NULL...

Як я можу отримати подібну матрицю, але уникати нульових значень?

countryId, en,    es,       fr
1,       spain,  españa,   espagne
2,       france, francia,  france
3,       Italy,  italia,   italie

Танки.

Відповіді:

1 для відповіді № 1

Спробуйте виконати наступний запит:

SELECT
countryId,
name,
MAX(CASE WHEN lanId = 1 THEN translation END) AS en,
MAX(CASE WHEN lanId = 2 THEN translation END) AS es,
MAX(CASE WHEN lanId = 3 THEN translation END) AS fr
FROM translations
GROUP BY
countryId,
name

Вихід:

введіть опис зображення тут

Демо тут:


1 для відповіді № 2

Вам потрібно групувати за країною:

SELECT countryId,
case WHEN lanId = 1 THEN translation END as en,
case WHEN lanId = 2 THEN translation END as es,
case WHEN lanId = 3 THEN translation END as fr
FROM translations
GROUP BY countryId