2011-04-28 154 views
2

如何从SQL查询语句

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接入)?

谢谢。

回答

5
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列,与被命名为subject的硬编码值'Math'一个“虚拟”的列。由于您未在某处存储值'Math',因此必须进行硬编码。然后最后它也使用名称mark来选择列math。请注意0​​和'Math'之间的区别 - 其中一个是另一个字符串,因为是单引号。

这是所有三个主题进行(如果你有四个科目,你需要在UNION四个部分)

的UNION ALL将全部三个SELECT查询到一个单一的查询。 andr解决方案(已经被不理解它的人降级)通过将其明确地放入派生表(或内联视图)中使得更清楚。

单独运行每个SELECT以查看各个部件在做什么。

部分as mark被称为“列别名”,也可用于从联接中的不同表中检索具有相同名称的列,并且在结果集中仍具有唯一名称。

+0

@a_horse_with_no_name:哎呀,在同一时间相同的答案。你想让我删除我的帖子吗?反正+1到你,因为你是比我快:) – Marco 2011-04-28 06:37:44

+0

问题是我把它当作一个Excel工作表,我想将其转换在同一时间:) – Ali 2011-04-28 06:41:53

+0

@a_horse_with_no_name聚齐3分模仿的答案是有可能为我提供多一点的解释:) BTW我想它和它的工作就像一个魅力 的感谢! – andr 2011-04-28 06:43:42

2

使用数据透视表:

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

希望这有助于

+1

应当指出,在几乎所有的简单的SQL图式,需要创建一个数据透视表都表示严重设计的数据库。如果你实际上不得不在查询中转换到不同的模式,为了获得可用的数据,这是一个问题。在这种情况下,我会问 - 添加新课程时会发生什么?我假设这可能是一项任务,所以我不会花更多的时间来改变良好的数据库设计! – 2011-04-28 06:36:43

+0

同意。有时候,需要同时制作和更新单独的模型。 – 2011-04-28 06:44:43

+0

不支持数据透视表吗? – 2011-04-28 06:58:53

1
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

谁低估了那个:那是愚蠢的,因为它是一个完全有效的正确的解决方案 – 2011-04-28 07:01:43

+0

测试,它的工作:)感谢您的回复 – Ali 2011-04-28 07:26:31

3

试试这个:

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 
+0

聚齐3个模仿的答案在同一时间:) – andr 2011-04-28 06:43:57

1
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 

这里table =

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

在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 
+0

恐怕我不能尝试这个,因为我使用的MS Access和MySQL :( – Ali 2011-04-28 07:20:41

+2

我明白了,谢谢了解详细情况。这可能是因为你的回答下一个问题的时候,我会记住它,但如果你标记你的问题也相应的将是巨大的。:) – 2011-04-28 07:37:30

+0

对不起,会做:) – Ali 2011-04-28 07:50:34