1

如何从表中返回多个列?

我的课程表:

| 课程 | 个人身份 | 任务ID | 状态 |

计算机 < > User1 <> 1 <> 确认
计算机 < >User2 <> 1 <> 未确认
计算机 < >User3 <> 1 <> 未确认
计算机 < >User1 <> 2 <> 确认
计算机 < >User2 <> 2 <> 确认
计算机 < >User3 <> 2 <> 未确认

我希望它像这样返回:

| 个人身份 | 任务_1 | 任务_2 |

User1 <> 确认 <> 确认
User2 <> 未确认 <> 确认
User3 <> 未确认 <> 未确认

问题 2:
我的表中还有其他课程(数学、英语等)的任务多于两个。我需要使用某种迭代来返回任务列吗?因为我不想为每门课程(超过 100 门)进行 SQL 查询。

提前致谢

4

3 回答 3

3

您可以使用 aCASE和聚合:

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

如果您有未知数量的任务,那么您可以使用准备好的语句来动态生成:

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

于 2012-09-26T14:43:20.720 回答
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
于 2012-09-26T14:43:51.267 回答
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
于 2012-09-26T16:07:00.743 回答