アプリ版:「スタンプのみでお礼する」機能のリリースについて

こういうビューを抽出するSQLを書きたいのですが、わからず困っています。


TableA (主キー:ID)
 ID│CodeA
──┼─────
0001│123
0002│234
 :│:


TableB (主キー:ID)
 ID│CodeA │CodeB │Name
──┼───┼───┼───
  1│123  │A1  │XXX
  2│123  │B1  │YYY
  3│123  │C1  │ZZZ


欲しい抽出結果 (CodeBとNameは1行に最大5回まで存在しうる)
 ID│CodeA │CodeB1│Name1 │CodeB2│Name2 │CodeB3│Name3
──┼───┼───┼───┼───┼───┼───┼───
0001│123  │A1  │XXX  │B1  │YYY  │C1  │ZZZ


こういうのってSELECT文だけで記述できるのでしょうか?
どのように記述すれば良いでしょうか?

A 回答 (1件)

「CodeBとNameは1行に最大5回まで存在しうる」ので常に5セット(CodeB5,Name5まで)返していいということですよね。


SQL Server 2005以降であれば、以下のような書き方ができます。

SELECT
ID,
CodeA,
MAX(CASE WHEN Seq=1 THEN CodeB END) CodeB1,
MAX(CASE WHEN Seq=1 THEN Name END) Name1,
MAX(CASE WHEN Seq=2 THEN CodeB END) CodeB2,
MAX(CASE WHEN Seq=2 THEN Name END) Name2,
MAX(CASE WHEN Seq=3 THEN CodeB END) CodeB3,
MAX(CASE WHEN Seq=3 THEN Name END) Name3,
MAX(CASE WHEN Seq=4 THEN CodeB END) CodeB4,
MAX(CASE WHEN Seq=4 THEN Name END) Name4,
MAX(CASE WHEN Seq=5 THEN CodeB END) CodeB5,
MAX(CASE WHEN Seq=5 THEN Name END) Name5
FROM
(SELECT a.ID,a.CodeA,b.CodeB,b.Name,
ROW_NUMBER() OVER (PARTITION BY a.CodeA ORDER BY b.CodeB) Seq
FROM TableA a
INNER JOIN TableB b ON b.CodeA=a.CodeA) tmp
GROUP BY ID,CodeA
    • good
    • 0
この回答へのお礼

jamshid6様

ご回答ありがとうございます。
ROW_NUMBER 関数というものがあるんですね。
お蔭様で希望のデータを抽出することができました。
とても便利な機能で目から鱗モノです。

助かりました。
どうもありがとうございました。

お礼日時:2010/01/29 09:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!