[pgsql-jp: 30905] レコード内容から列名を取得・生成?するSQL

kenbooit @ excite.co.jp kenbooit @ excite.co.jp
2003年 9月 2日 (火) 14:12:19 JST


島田と申します。
SQLもしくはエクセル!?の質問になってしまうかもしれないのですが、
もしよろしければご教授ください。

まず下のような3つのテーブルがあります。

(master)
id	|	name
--------------
m1	|	A
m2	|	B
m3	|	C


(fk_table)
id	|	fk_master	|	number	|	text	|	fk_location
------------------------------------------------------
1	|	m1			|	1		|	tanaka1	|	y1
2	|	m1			|	2		|	tanaka2	|	y2
3	|	m1			|	3		|	tanaka3	|	y3
4	|	m2			|	1		|	yama1	|	y4
5	|	m2			|	2		|	yama2	|	y5
6	|	m2			|	3		|	yama3	|	y6
7	|	m3			|	1		|	ito1	|	y7
8	|	m3			|	2		|	ito2	|	y8
9	|	m3			|	3		|	ito3	|	y9


(location)
id	|	yuubin
----------------
y1	|	111-1111
y2	|	222-2222
y3	|	333-3333
y4	|	444-4444
y5	|	555-5555
y6	|	666-6666
y7	|	777-7777
y8	|	888-8888
y9	|	999-9999

下のSQLを実行すると

SELECT m.name, f.number, l.yuubin, f.text
FROM master m, fk_table f, location l
WHERE m.id = f.fk_master
 AND  l.id = f.fk_localtion
ORDER BY f.text, f.number

下のような結果が返ってくるのですが

 name | number |  yuubin  |  text
------+--------+----------+---------
 A    |      1 | 111-1111 | tanaka1
 A    |      2 | 222-2222 | tanaka2
 A    |      3 | 333-3333 | tanaka3
 B    |      1 | 444-4444 | yama1
 B    |      2 | 555-5555 | yama2
 B    |      3 | 666-6666 | yama3
 C    |      1 | 777-7777 | ito1
 C    |      2 | 888-8888 | ito2
 C    |      3 | 999-9999 | ito3

最終的には下のようなデータ形式を要求されています。

 name |  yuubin1  | 
text1	|	yuubin2	|	text2	|	yuubin3	|	text3
-----------------------------------------------------------------------------------
 A    |  111-1111 |
tanaka1	|	222-2222|	tanaka2	|	333-3333|	tanaka3
 B    |  444-4444 |
yama1	|	555-5555|	yama2	|	666-6666|	yama3
 C    |  777-7777 |
ito1	|	888-8888|	ito2	|	999-9999|	ito3

これはSQLでは難しいでしょうか。
レコード数が1万件ぐらいあるので、
できれば、エクセルでどうこうするっていうのは避けたいのですが・・・。
(エクセルで簡単にできる方法があれば、それはそれでいいのですが、それも思いついていないのが現状です)

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



pgsql-jp メーリングリストの案内