#mysql #sql #ms-access
#mysql #sql #ms-access
Вопрос:
Как я могу перейти от
SID Name Math English French
1 Sam 16 17 19
2 Tom 18 14 12
3 Al 90 33 2
Для:
SID subject Mark
1 Math 16
1 English 17
1 French 19
2 Math 18
2 English 14
2 French 12
3 Math 90
3 English 33
3 French 2
используя SQL (MySQL и MS Access, если возможно)?
Спасибо.
Ответ №1:
SELECT sid, 'Math' as subject, math as mark
FROM your_table
UNION ALL
SELECT sid, 'English' as subject, english as mark
FROM your_table
UNION ALL
SELECT sid, 'French' as subject, french as mark
FROM your_table
Но основной причиной вашей проблемы является неправильный дизайн базы данных. Эти объекты не должны быть столбцами в первую очередь и должны храниться в таблице, очень похожей на ваш желаемый результат.
Редактировать
Итак, что это делает?
SELECT sid, 'Math' as subject, math as mark
FROM your_table
Возвращает sid
столбец, «виртуальный» столбец с жестко запрограммированным значением, 'Math'
которому присвоено имя subject
. Поскольку вы где-то не сохранили значение 'Math'
, это должно было быть жестко запрограммировано. Затем, наконец, он также выбирает столбец, math
используя вместо этого имя mark
. Обратите внимание на разницу между math
и 'Math'
— один представляет собой столбец, а другой — строковый литерал из-за одинарных кавычек.
Это сделано для всех трех предметов (если бы у вас было четыре предмета, вам понадобилось бы объединить четыре части)
ОБЪЕДИНЕНИЕ ALL объединяет все три выборки в один запрос. решение andr (за которое проголосовал кто-то, кто его не понял) делает это еще более понятным, явно помещая это в производную таблицу (или встроенное представление).
Запустите каждый SELECT отдельно, чтобы увидеть, что делают отдельные части.
Часть as mark
называется «псевдонимом столбца» и может также использоваться для извлечения столбцов с одинаковыми именами из разных таблиц в объединении и по-прежнему иметь уникальные имена в результирующем наборе.
Комментарии:
1. @a_horse_with_no_name: упс, тот же ответ в то же время. Вы хотите, чтобы я удалил свой пост? В любом случае, 1 тебе, потому что ты был быстрее меня 🙂
2. проблема в том, что у меня есть это как лист Excel, и я хочу преобразовать его в базу данных access
3. @a_horse_with_no_name три одинаковых ответа одновременно 🙂
4. возможно ли предоставить мне немного больше объяснений 🙂 Кстати, я попробовал это, и это сработало как шарм, спасибо!
5. @a-horse-with-no-name: ты великолепен!, -не говоря уже о роке — спасибо, чувак 🙂
Ответ №2:
Попробуйте это:
SELECT SID,'Math' subject, Math Mark
FROM table
UNION ALL
SELECT SID,'English' subject, English Mark
FROM table
UNION ALL
SELECT SID,'French' subject, French Mark
FROM table
Комментарии:
1. три одинаковых ответа одновременно 🙂
Ответ №3:
Комментарии:
1. Следует указать, что почти во всех простых схемах SQL необходимость создания сводной таблицы вообще указывает на плохо спроектированную базу данных. Если вам приходится, по сути, переходить к другой схеме в запросе, просто чтобы получить полезные данные, это проблема. В этом случае я бы спросил — что происходит, когда добавляется новый курс? Я предполагаю, что это, вероятно, для назначения, поэтому я больше не буду тратить время на пропаганду хорошего дизайна базы данных!
2. Согласен. Иногда необходимо создавать и обновлять отдельную модель параллельно.
3. О, я люблю сумасшедшие, излишне сложные запросы, безусловно, они забавные. Но реальный мир требует практичности, а не удовольствия, вызванного SQL!
4. Иногда у кого-то нет контроля над формой, в которой он получает данные.
Ответ №4:
В SQL Server 2005 или более поздней версии вы можете использовать UNPIVOT:
SELECT
SID,
Subject,
Mark
FROM (
SELECT SID, Math, English, French
FROM atable
) s
UNPIVOT (
Mark FOR Subject IN (Math, English, French)
) u
Комментарии:
1. Боюсь, я не могу попробовать это, поскольку я использую MS Access и MySQL : (
2. Понятно, спасибо за подробности. Возможно, я вспомню это, отвечая на ваш следующий вопрос, но было бы здорово, если бы вы также соответствующим образом помечали свои вопросы. 🙂
Ответ №5:
select * from
( select sid, 'Math' as subject, math as mark from t
union all
select sid, 'English' as subject , English as Mark from t
union all
select sid, 'French' as subject, French as mark from t
) order by 1;
Должно сработать
Комментарии:
1. Кто бы ни проголосовал против этого: это было глупо, потому что это полностью допустимое и корректное решение
Ответ №6:
select * from (
select SID, 'Math' as subject, math as mark from table
union
select SID, 'English' as subject, English as mark from table
union
select SID, 'French' as subject, french as mark from table
) order by sid asc
где таблица =
SID Name Math English French
1 Sam 16 17 19
2 Tom 18 14 12
3 Al 90 33 2