1

テーブルから複数の列を返すにはどうすればよいですか?

マイコーステーブル:

| コース| PersId | Taskid | ステータス|

コンピューター<>User1<>1<>確認済み
コンピューター<>User2<>1<>未確認
コンピューター<>User3<>1<>未確認
コンピューター<>User1<>2<>確認済み
コンピューター<>User2<>2<>確認済み
コンピューター<>User3<>2<>未確認

私はそれをこのように戻したい:

| PersId | Task_1 | Task_2 |

User1<>確認済み<>確認済み
User2<>未確認<>確認済み
User3<>未確認<>未確認

質問2:
私のテーブルには2つ以上のタスクがある他のコース(数学、英語など)があります。タスク列を返すために、ある種の反復を使用する必要がありますか?単一のコース(100以上)ごとにSQLクエリを作成したくないためです。

前もって感謝します

4

3 に答える 3

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 FiddlewithDemoを参照してください

タスクの数が不明な場合は、プリペアドステートメントを使用してこれを動的に生成できます。

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 FiddlewithDemoを参照してください

于 2012-09-26T14:43:20.720 に答える
0

PIVOTE男の力を使う

PIVOTは、式の1つの列の一意の値を出力の複数の列に変換することでテーブル値の式をローテーションし、最終出力で必要な残りの列値に対して必要な集計を実行します。

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 に答える
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 に答える