2012-09-26 23 views
1

如何從表中返回多列?如何從一個表中返回多列?

我的課程表:

|課程| PersId | Taskid |狀態|

計算機<>用戶1 <> 1 <>確認
計算機<>用戶2 <> 1 <>未確認
計算機<>用戶3 <> 1 <>未確認
計算機<>用戶1 <> 2 <>確認
計算機<>用戶2 <> 2 <>確認
計算機<>用戶3 <> 2 <>未經證實的

我想這回是這樣的:

| PersId | Task_1 | Task_2 |

用戶1 <>確認<>確認
用戶2 <>未經證實的<>確認
用戶3 <>未經證實的<>未經證實

問題2:
還有其他課程(數學,英語等)在我的桌子上,任務多於兩個。我是否需要使用某種迭代來返回任務列?因爲我不想爲每個單個課程(超過100)進行SQL查詢。

在此先感謝

+0

感謝您的快速回答! ive更新了我的問題 – user1693991

回答

3

可以使用CASE和骨料:

select persid, 
    max(case when taskid = 1 then status end) as Task1, 
    max(case when taskid = 2 then status end) as Task2 
from course 
group by persid 

如果要包括課程信息:

select persid, 
    course, 
    max(case when taskid = '1' then status end) as Task1, 
    max(case when taskid = '2' then status end) as Task2 
from course 
group by persid, course 
order by course, persid 

SQL Fiddle with Demo

如果你有不明數量的任務,那麼你c一個使用prepared statement動態生成的:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'max(case when taskid = ''', 
     taskid, 
     ''' then status end) AS Task_', 
     taskid 
    ) 
) INTO @sql 
FROM course; 

SET @sql = CONCAT('SELECT persid, course, ', @sql, ' 
        FROM course 
        group by persid, course 
        order by course, persid'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SQL Fiddle with Demo

+0

我必須手動添加其他課程的任務嗎?是否沒有迭代我可以使用它爲我做?因爲我有一門有+40任務的課程,而且課程的大部分課程沒有相同數量。 – user1693991

+0

@ user1693991看到我的最終查詢,它將動態生成sql,因此您不必硬編碼任何值。 – Taryn

+0

好吧,我現在試試。 – user1693991

0

像這樣:

SELECT 
    PersId, 
    MAX(CASE WHEN Taskid = 1 THEN Status END) AS Task_1, 
    MAX(CASE WHEN Taskid = 2 THEN Status END) AS Task_2 
FROM Courses 
GROUP BY persID 
0

PIVOTE人的使用功率

PIVOT通過轉動旋轉的表值表達式將表達式中的一列中的唯一值輸出到多個列中,並在需要時進行聚合在最終輸出中需要的剩餘列值。

SELECT Course, PersId, [1] AS [Task_1], [2] AS [Task_2] 
FROM 
(
    SELECT Course, PersId, TaskId, [Status] 
    FROM t2 
) as a 
PIVOT 
(
    MAX([Status]) 
    FOR TaskId IN ([1], [2]) 
) as b 
+0

MySQL沒有'PIVOT'函數,所以你必須使用'CASE'和一個聚合函數。 – Taryn

+0

沒有人說MySQL請求是必要的 –

+0

這個問題被標記爲MySQL – Taryn