0

mysqlを介して複数の行を1つの行に結合するにはどうすればよいですか?

例 :

学生テーブル

Sno.|  Name |  Subjects
1.  | ABC   |  1
2.  | ABC   |  3
3.  | ABC   |  4
4.  | FMC   |  2
5.  | ABC   |  4
6.  | JBC   |  4

論文表:

Sno. | Paper Name | Type 
 1.      French     Optional
 2.      English    Mandatory
 3.      Japenese   Optional
 4.      Maths      Optional

今、私はこの形式でそれが欲しい

Sno.| Name|   Sub1  |  Sub2    | Sub3  |  Sub4 |
1.  | ABC |  French |  Japenese| Maths | Null  |
2.  | FMC |  Null   | Null     | Null  | Null  |
3.  | JBC |  Maths  | Null     | Null  | Null  |

選択したいのは、論文テーブルの論文名と学生名、もう一方のテーブルの4科目です。オプションの紙だけを見たいです。どうしたらいいのかわからない?

4

1 に答える 1

2

あなたが探しているコンセプトはピボットだと思います。

参加付きバージョン

select 
  name,
  max(if(s.subject = 1 and p.type = 'Optional', p.paper_name, null)) as subject1,
  max(if(s.subject = 2 and p.type = 'Optional', p.paper_name, null)) as subject2,
  max(if(s.subject = 3 and p.type = 'Optional', p.paper_name, null)) as subject3,
  max(if(s.subject = 4 and p.type = 'Optional', p.paper_name, null)) as subject4
from 
  students s
inner join
  papers p on p.sno = s.subject
group by s.name

SQLフィドルデモ

結合の代わりに副選択を使用したバージョン

select 
  name,
  max(
    case 
      when subject = 1 
        then (select paper_name from papers p where p.sno = subject and type = 'Optional') 
      else 
        null 
    end) as subject1, 
  max(
    case 
      when subject = 2 
        then (select paper_name from papers p where p.sno = subject and type = 'Optional') 
      else 
        null 
    end) as subject2,
  max(
    case 
      when subject = 3 
        then (select paper_name from papers p where p.sno = subject and type = 'Optional') 
      else 
        null 
    end) as subject3,
  max(
    case 
      when subject = 4
        then (select paper_name from papers p where p.sno = subject and type = 'Optional') 
      else 
        null 
    end) as subject4
from 
  students
group by 
  name

SQLフィドルデモ

于 2012-10-28T14:10:13.637 に答える