1

3つのテーブル、usersテーブル、test_sessionsテーブル、およびcoursesテーブルがあります。

ユーザーの完全なリストを含むレポートを作成する必要があります。コーステーブルでは、一部のコースにフィールド'track' = 1があります。1に等しい場合は、レポートにそのコースの列が必要です。

test_sessionsテーブルには、user_idとcourse_idに加えて、complete_dateフィールドがあります。

レポートには、次のようなものが必要です。

______|Tracked Course 1|Tracked Course 2 |Tracked Course 3
User 1|complete date   |complete date    |complete date
User 2|complete date   |complete date    |complete date
User 3|complete date   |complete date    |complete date

これを行うための単一のクエリを記述できるようにしたいのですが、可能ですか?

4

1 に答える 1

2

これは基本的にはPIVOTですが、MySQLにはがないため、集計とステートメントPIVOTを使用して複製する必要があります。CASE値を取得したいコース名がわかっている場合は、それをハードコーディングできます。

select u.userName,
  max(case when c.coursename = 'Course 1' then s.completed_date end) Course1,
  max(case when c.coursename = 'Course 2' then s.completed_date end) Course2,
  max(case when c.coursename = 'Course 3' then s.completed_date end) Course3
from users u
left join test_sessions s
  on u.user_id = s.user_id
left join courses c
  on s.course_id = c.course_id
group by u.username

SQL FiddlewithDemoを参照してください

コースの数が不明な場合は、次のようなプリペアドステートメントを使用できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when c.coursename = ''',
      coursename,
      ''' then s.completed_date end) AS ',
      coursename
    )
  ) INTO @sql
FROM courses;

SET @sql = CONCAT('SELECT u.userName, ', @sql, ' 
                  from users u
                  left join test_sessions s
                    on u.user_id = s.user_id
                  left join courses c
                    on s.course_id = c.course_id
                  group by u.username');

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

デモ付きのSQLフィドルを参照してください

于 2012-11-13T14:40:02.020 に答える