質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

779閲覧

学歴情報を横に並べたい

ShoyaWatanabe

総合スコア7

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/06/18 13:31

学歴情報を横に並べたい

お世話になっております。
やりたいこととしましては、PostgreSQLで[表3]のようにユーザテーブルと
学歴テーブルを結合して学歴を行番号の降順で横に並べたいです。

以上、よろしくお願い致します。

ユーザテーブルのID、学歴テーブルのID、行番号はPKです。

[表1]ユーザテーブル
|ID|ユーザ名|性別|生年月日
|:--|:--:|--:|
|001|山田|男|1990/01/01
|002|鈴木|女|1992/03/31
|003|高橋|男|1980/02/21

[表2]学歴テーブル
|ID|行番号|学校名|学部学科名|開始日|終了日
|:--|:--:|--:|
|001|1|A高校|普通科|2005/04/01|2008/03/31
|001|2|B大学|経済学部経済学科|2009/04/01|2013/03/31
|001|3|B大学院|経営マネジメント学科|2013/04/01|2015/03/31
|002|1|Z高校|普通科|2008/04/01|2011/03/31
|002|2|X大学|法学部法律学科|2011/04/01|2015/03/31
|003|1|M高校|普通科|1995/04/01|1998/03/31
|003|2|N大学|外国語学部英語学科|1998/04/01|2002/03/31

[表3]想定している結果
|ID|ユーザ名|性別|生年月日|学歴1:学校名|学歴1:学部学科名|学歴1:開始日|学歴1:終了日|学歴2:学校名|学歴2:学部学科名|学歴2:開始日|学歴2:終了日
|:--|:--:|--:|
|001|山田|男|1990/01/01|B大学院|経営マネジメント学科|2013/04/01|2015/03/31|B大学|経済学部経済学科|2009/04/01|2013/03/31
|002|鈴木|女|1992/03/31|X大学|法学部法律学科|2011/04/01|2015/03/31|Z高校|普通科|2008/04/01|2011/03/31
|003|高橋|男|1980/02/21|N大学|外国語学部英語学科|1998/04/01|2002/03/31|M高校|普通科|1995/04/01|1998/03/31

試したこと

以下のサイトを見て直近の日付を抽出できることは理解できましたが、[表3]に示すような結果を抽出することができません。
SQL流行間比較(2) 直近,直近の1つ前,そのまた1つ前…

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

最終学歴を新しい方から2つということであれば、開始日または終了日の降順に並べればよいので、array_agg()の結果を添え字で1番目と2番目を取得すればOK。仮に学歴の登録が一つでも大丈夫です。

SQL

1select t1.* 2 , t2.agg1[1] as 学歴1:学校名, t2.agg2[1] as 学歴1:学部学科名, t2.agg3[1] as 学歴1:開始日, t2.agg4[1] as 学歴1:終了日 3 , t2.agg1[2] as 学歴2:学校名, t2.agg2[2] as 学歴2:学部学科名, t2.agg3[2] as 学歴2:開始日, t2.agg4[2] as 学歴2:終了日 4from ユーザテーブル t1 left join ( 5 select id 6 , array_agg(学校名 order by 開始日 desc) as agg1, array_agg(学部学科名 order by 開始日 desc) as agg2 7 , array_agg(開始日 order by 開始日 desc) as agg3, array_agg(終了日 order by 開始日 desc) as agg4 8 from 学歴テーブル 9 group by id 10 ) t2 11 on t1.id=t2.id 12order by t1.id

または

SQL

1select t1.id, ユーザ名, 性別, 生年月日 2 , (array_agg(学校名 order by 開始日 desc))[1] as 学歴1:学校名 3 , (array_agg(学部学科名 order by 開始日 desc))[1] as 学歴1:学部学科名 4 , (array_agg(開始日 order by 開始日 desc))[1] as 学歴1:開始日 5 , (array_agg(終了日 order by 開始日 desc))[1] as 学歴1:終了日 6 , (array_agg(学校名 order by 開始日 desc))[2] as 学歴2:学校名 7 , (array_agg(学部学科名 order by 開始日 desc))[2] as 学歴2:学部学科名 8 , (array_agg(開始日 order by 開始日 desc))[2] as 学歴2:開始日 9 , (array_agg(終了日 order by 開始日 desc))[2] as 学歴2:終了日 10from ユーザテーブル t1 left join 学歴テーブル t2 11 on t1.id=t2.id 12group by t1.id, ユーザ名, 性別, 生年月日

投稿2018/06/18 15:28

編集2018/06/19 01:21
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

できないことは無いですが行番号を最初から調整しないと集計列があわないですよね

sample

postgreだと動かないかもしれませんが一応sample

  • 元データ

SQL

1create table user (uid int unique,uname varchar(20),gender varchar(10),birth date); 2insert into user values 3(1,'山田','男','1990/01/01'), 4(2,'鈴木','女','1992/03/31'), 5(3,'高橋','男','1980/02/21'); 6 7create table gakureki (uid int,row int,gname varchar(20),gakka varchar(20),sdate date,edate date); 8insert into gakureki values 9(1,1,'A高校','普通科','2005/04/01','2008/03/31'), 10(1,2,'B大学','経済学部経済学科','2009/04/01','2013/03/31'), 11(1,3,'B大学院','経営マネジメント学科','2013/04/01','2015/03/31'), 12(2,1,'Z高校','普通科','2008/04/01','2011/03/31'), 13(2,2,'X大学','法学部法律学科','2011/04/01','2015/03/31'), 14(3,1,'M高校','普通科','1995/04/01','1998/03/31'), 15(3,2,'N大学','外国語学部英語学科','1998/04/01','2002/03/31');
  • 集計

SQL

1select * from 2(select uid,(select max(row)-t1.row+1 from gakureki where t1.uid=uid) as rank,gname,gakka,sdate,edate from gakureki as t1 having rank=1) as t1 3left join (select uid,(select max(row)-t1.row+1 from gakureki where t1.uid=uid) as rank,gname,gakka,sdate,edate from gakureki as t1 having rank=2) as t2 on t1.uid=t2.uid 4left join (select uid,(select max(row)-t1.row+1 from gakureki where t1.uid=uid) as rank,gname,gakka,sdate,edate from gakureki as t1 having rank=3) as t3 on t1.uid=t3.uid 5

投稿2018/06/18 13:39

編集2018/06/18 14:07
yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShoyaWatanabe

2018/06/18 13:54

yambejpさん ご回答ありがとうございます。 >行番号を最初から調整しないと集計列があわない 行番号を調整するとはどのような意味でしょうか?
yambejp

2018/06/18 13:57

最終学歴を1、その前を2、更に前を3・・・のような指定をするということです
ShoyaWatanabe

2018/06/18 14:30

サンプルまでいただきありがとうございます。 サンプルを参考に実行したら想定した結果が実行できました。 ベストアンサーとさせていただきます。
guest

0

いろいろ調整は必要ですが、PostgreSQLでのクロス集計(crosstab)の動作について を参考にされては?

投稿2018/06/18 13:56

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShoyaWatanabe

2018/06/18 14:41

Orlofskyさん ご回答ありがとうございます。 教えていただいたリンク参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問