2011-04-28 227 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