Оператор SQL-запроса - PullRequest
       2

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

2 голосов
/ 28 апреля 2011

Как я могу изменить значение с

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, если это возможно)?

Спасибо.

Ответы [ 6 ]

5 голосов
/ 28 апреля 2011
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' - один является столбцом, а другой - строковым литералом из-за одинарных кавычек.

Это сделано для всех трех предметов (если у вас было четыре предмета, вам понадобилось бы четыре части в СОЮЗЕ)

UNION ALL объединяет все три SELECT в один запрос. Решение andr (которое было отвергнуто кем-то, кто его не понимал), делает это еще яснее, явно помещая это в производную таблицу (или встроенное представление).

Запустите каждый SELECT отдельно, чтобы увидеть, что делают отдельные части.

Деталь as mark называется «псевдонимом столбца», и ее также можно использовать для извлечения столбцов с одинаковыми именами из разных таблиц в объединении, которые по-прежнему имеют уникальные имена в наборе результатов.

3 голосов
/ 28 апреля 2011

Попробуйте это:

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
2 голосов
/ 28 апреля 2011

В 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
2 голосов
/ 28 апреля 2011

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

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

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

1 голос
/ 28 апреля 2011
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
1 голос
/ 28 апреля 2011
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;

Должен сделать трюк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...