Есть ли способ в SQL получить данные, показанные в левой таблице, для вывода, как на рисунке справа?
Если у вас есть конечный статический список тестов, и ни один пользователь не проходит тест более одного раза, вы можете сделать это следующим образом:
SELECT UserID,
SUM(Result * (Unit = "Test 1")) AS "Test 1",
SUM(Result * (Unit = "Test 2")) AS "Test 2",
SUM(Result * (Unit = "Test 3")) AS "Test 3"
FROM table
GROUP BY UserID;
Это работает, используя SUM для GROUP как взвешенную сумму всех записей с весом 1
для строки с соответствующим тестом и 0
для всех других строк (сравнение оценивается как 1 для TRUE и 0 для FALSE).
редактировать
Как отметил @Nick в своем комментарии, вы можете пойти более читабельным и менее зависящим от реализации способом, используя CASE вместо стиля умножения на логическое значение:
SELECT UserID,
SUM(CASE WHEN Unit = "Test 1" THEN Result ELSE 0 END) AS "Test 1",
SUM(CASE WHEN Unit = "Test 2" THEN Result ELSE 0 END) AS "Test 2",
SUM(CASE WHEN Unit = "Test 3" THEN Result ELSE 0 END) AS "Test 3"
FROM table
GROUP BY UserID;
SUM(CASE WHEN Unit = 'Test 1' THEN Result ELSE 0 END) AS `Test 1`
является более традиционным и не полагается на логическое значение, рассматриваемое как 1 или 0.