miau's blog?

SQL をで行を横展開

たとえば、こんなテーブルがあったとして。

SELECT * FROM CustomerFamily

cust_id family_id name
==========================
1 1 波平
1 2 フネ
1 3 カツオ
2 1 マスオ
2 2 サザエ
2 3 タラオ


それをこんな感じで抽出したい場合。


cust_id family1 family2 family3
==================================
1 波平 フネ カツオ
2 マスオ サザエ タラオ


まぁ、正攻法では CURSOR 使ってぐるぐる回すことになるんでしょうけど、DataGrid とか使いたい場合はそうはいかないわけで。


以前似たようなことを聞かれたときは、「できない」って答えたか、あるいは副照会使って


SELECT
cust_id,
(SELECT name FROM CustomerFamily WHERE cust_id = A.cust_id AND family_id = 1) AS family1,
(SELECT name FROM CustomerFamily WHERE cust_id = A.cust_id AND family_id = 2) AS family2,
(SELECT name FROM CustomerFamily WHERE cust_id = A.cust_id AND family_id = 3) AS family3
FROM
CustomerFamily AS A


とかやればいいんじゃないですかー?とか答えたと思うんですけど。
もっと簡単にできることに気づいた。


SELECT
cust_id,
MAX(CASE family_id WHEN 1 THEN name ELSE NULL END AS family1),
MAX(CASE family_id WHEN 2 THEN name ELSE NULL END AS family2),
MAX(CASE family_id WHEN 3 THEN name ELSE NULL END AS family3)
FROM
CustomerFamily
GROUP BY
cust_id


見た目もそれほど汚くないし、急いでるときや、DataGrid 使いたいような場合はいいんではないかと。
パフォーマンスは悪そうだけど・・・カーソルをぐるぐる回すのと比べてどうなんだろう?


でもこういうの、SQL とかちゃんと勉強してる人にとっては常識だったりするんだろうな・・・。
SQL は普通に書けるつもりでいたんですけど、もっと勉強しておかないとダメですね。


(追記)
んー・・・アクセスプランがまともなら、副照会のほうがパフォーマンス良さそうな気がしますね。
ま、こんな書き方もありそう、ということで。

(2005/05/09 修正)
SQL 間違ってた。ポカミス多い・・・。
posted at 00:45:51 on 2005-04-30 by miau - Category: Work No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

wrote:

うんこもれそう
2008-09-06 20:39:48

miau wrote:

このエントリから失禁するほどの何かを得た、ということであれば嬉しいのですが・・・投稿のテストか何かですかね?

前者であればも少し具体的にお願いします。後者であれば消しておいていただけると助かります。
2008-09-11 17:33:01

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。