プロが教える店舗&オフィスのセキュリティ対策術

SQL SERVER 2005

Aのテーブルから
A1というビューを作成しました。

そのビューの内容というのは

AのテーブルのTOP4を
列に変換したいというものです。


例)

Aテーブル
(列名 AA AB AC)

AA1 AB1 AC1
AA2 AB2 AC2
AA3 AB3 AC3



AAビュー

AA_1 AB_1 AC_1 AA_2 AB_2 AC_2 AA_3 AB_3 AC_3
AA1 AB1 AC1 AA2 AB2 AC2 AA3 AB3 AC3


となるような、ビューのSQLがあれば、教えて頂きたく思います。
よろしくお願いします。

A 回答 (3件)

・TOP 4となっていますが、3つしかないのは3レコードしかないからですか?


・TOP 4はORDERがついていますか?それとも任意の先頭4レコードですか?

この回答への補足

すみません。
Aのテーブルには

その後、最初の3件と同じようなデータのレコードが続きます。


Aテーブル
(列名 AA AB AC)

AA1 AB1 AC1
AA2 AB2 AC2
AA3 AB3 AC3



AA100 AB100 AC100




という、感じです。

補足日時:2008/10/27 16:58
    • good
    • 0
この回答へのお礼

補足が中途半端でした。
すみません。

・TOP 4となっていますが、3つしかないのは3レコードしかないからですか?
⇒こちらについては補足で説明させて頂いたとおりですが、
実際には8件ほどしかなく、8件分を列にしたいと思っています。
(なので、細くのレコード数は多すぎです。)

・TOP 4はORDERがついていますか?それとも任意の先頭4レコードですか?
⇒ORDERはあります。
例には書き忘れていましたが、
Aのテーブルには別のアイデンティティのIDがあり、
それでソートしようとしています。

お礼日時:2008/10/27 17:07

IDに抜けがないのであれば、以下のようにします。



SELECT
MAX(CASE WHEN ID=1 THEN AA END) AA_1,
MAX(CASE WHEN ID=1 THEN AB END) AB_1,
MAX(CASE WHEN ID=1 THEN AC END) AC_1,
MAX(CASE WHEN ID=2 THEN AA END) AA_2,
MAX(CASE WHEN ID=2 THEN AB END) AB_2,
MAX(CASE WHEN ID=2 THEN AC END) AC_2,
MAX(CASE WHEN ID=3 THEN AA END) AA_3,
MAX(CASE WHEN ID=3 THEN AB END) AB_3,
MAX(CASE WHEN ID=3 THEN AC END) AC_3,
MAX(CASE WHEN ID=4 THEN AA END) AA_4,
MAX(CASE WHEN ID=4 THEN AB END) AB_4,
MAX(CASE WHEN ID=4 THEN AC END) AC_4,
(以下同様)
FROM TABLE

IDに抜けがある可能性があるならば、以下のようにROW_NUMBERをつかって
行番号を生成した上で、同じようにします。

SELECT
MAX(CASE WHEN SEQ=1 THEN AA END) AA_1,
MAX(CASE WHEN SEQ=1 THEN AB END) AB_1,
MAX(CASE WHEN SEQ=1 THEN AC END) AC_1,
MAX(CASE WHEN SEQ=2 THEN AA END) AA_2,
MAX(CASE WHEN SEQ=2 THEN AB END) AB_2,
MAX(CASE WHEN SEQ=2 THEN AC END) AC_2,
MAX(CASE WHEN SEQ=3 THEN AA END) AA_3,
MAX(CASE WHEN SEQ=3 THEN AB END) AB_3,
MAX(CASE WHEN SEQ=3 THEN AC END) AC_3,
MAX(CASE WHEN SEQ=4 THEN AA END) AA_4,
MAX(CASE WHEN SEQ=4 THEN AB END) AB_4,
MAX(CASE WHEN SEQ=4 THEN AC END) AC_4,
(以下同様)
FROM
(SELECT ROW_NUMBER() OVER (ORDER BY ID) SEQ,* FROM TABLE) t

ただし、もし、質問者さんが8行なら8×3=24列、100行なら100×3=300列
が返ってくるようなビューをイメージされているのであれば、それは不可能です(ビューの列数は固定です)。
どうしてもそのようなことをしたい場合は、ストアドプロシージャを使うことになります。
(ただし、ビューより結果の使い勝手は相当劣りますので、期待したものにはならないでしょう)
    • good
    • 0
この回答へのお礼

ありがとうございます。

ところで、回答の

FROM
(SELECT ROW_NUMBER() OVER (ORDER BY ID) SEQ,* FROM TABLE) t

の、SEQの部分なのですが、
これはシステムの予約語でしょうか?
だとしたら、SQL SERVERに用意されているもなのでしょうか?

お礼日時:2008/10/27 19:14

>SELECT ROW_NUMBER() OVER (ORDER BY ID) SEQ,* FROM TABLE



ROW_NUMBERは分析関数と呼ばれますが、
「ROW_NUMBER () OVER (ORDER BY ID)」と書くことで、戻りのレコードをID別に並び替えた場合の連番を返してくれます。

これをメインのクエリで使うために、私が勝手に「SEQ」という名前をつけているとご理解ください。
    • good
    • 0
この回答へのお礼

自分の環境でも正常に動き、
期待していた結果となりました。

ご丁寧に答えてくださり、
ありがとうございました。

またのとき、よろしくお願いします。

お礼日時:2008/10/28 13:47

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

関連するカテゴリからQ&Aを探す