Declaración de consulta SQL

¿Cómo puedo cambiar de

SID Name Math English French 1 Sam 16 17 19 2 Tom 18 14 12 3 Al 90 33 2 

a:

 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 

usando SQL (MYsql y MS Access si es posible)?

Gracias.

 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 

Pero la causa de su problema es un layout de database equivocado. Esos temas no deben ser columnas en primer lugar y deben almacenarse en una tabla muy parecida a la salida deseada.

Editar

Entonces ¿Qué es lo que hace?

 SELECT sid, 'Math' as subject, math as mark FROM your_table 

Devuelve la columna sid , una columna "virtual" con el valor codificado 'Math' que se asigna el nombre del subject . Como no ha almacenado el valor 'Math' algún lugar, esto tenía que estar codificado. Entonces, finalmente, también selecciona la columna math usando la mark nombre en su lugar. Tenga en count la diferencia entre math y 'Math' : una es una columna y la otra es una cadena literal debido a las comillas simples.

Esto se hace para las tres asignaturas (si tuviera cuatro materias, necesitaría cuatro partes en la UNIÓN)

El UNION ALL combina los tres SELECT en una sola consulta. andr solution (que ha sido downvoted por alguien que no lo entendió) lo hace aún más claro al ponerlo explícitamente en una tabla derivada (o en una vista en línea).

Ejecute cada SELECCIÓN por sí mismo para ver qué hacen las partes individuales.

La parte as mark se denomina "alias de columna" y también se puede usar para recuperar columnas con el mismo nombre de diferentes tablas en una combinación y aún así tener nombres únicos en el set de resultados.

Prueba esto:

 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 

Use una tabla dinámica:

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

Espero que esto ayude

En SQL Server 2005 o superior, puede usar UNPIVOT :

 SELECT SID, Subject, Mark FROM ( SELECT SID, Math, English, French FROM atable ) s UNPIVOT ( Mark FOR Subject IN (Math, English, French) ) u 
 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; 

Debería hacer el truco

 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 

donde table =

 SID Name Math English French 1 Sam 16 17 19 2 Tom 18 14 12 3 Al 90 33 2