Оператор запроса SQL

#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:

Используйте сводную таблицу:

http://www.ehow.com/i/#article_5336679

Надеюсь, это поможет

Комментарии:

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