- ベストアンサー
行列の変換 - SQL SERVER 2005
- SQL SERVER 2005において、AのテーブルからA1というビューを作成しました。そのビューの内容はAのテーブルのTOP4を列に変換したいものです。
- ビューのSQLがあれば、AAビューが以下のようになるように教えてください。
- AAビュー:AA_1 AB_1 AC_1 AA_2 AB_2 AC_2 AA_3 AB_3 AC_3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>SELECT ROW_NUMBER() OVER (ORDER BY ID) SEQ,* FROM TABLE ROW_NUMBERは分析関数と呼ばれますが、 「ROW_NUMBER () OVER (ORDER BY ID)」と書くことで、戻りのレコードをID別に並び替えた場合の連番を返してくれます。 これをメインのクエリで使うために、私が勝手に「SEQ」という名前をつけているとご理解ください。
その他の回答 (2)
- jamshid6
- ベストアンサー率88% (591/669)
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列 が返ってくるようなビューをイメージされているのであれば、それは不可能です(ビューの列数は固定です)。 どうしてもそのようなことをしたい場合は、ストアドプロシージャを使うことになります。 (ただし、ビューより結果の使い勝手は相当劣りますので、期待したものにはならないでしょう)
お礼
ありがとうございます。 ところで、回答の FROM (SELECT ROW_NUMBER() OVER (ORDER BY ID) SEQ,* FROM TABLE) t の、SEQの部分なのですが、 これはシステムの予約語でしょうか? だとしたら、SQL SERVERに用意されているもなのでしょうか?
- jamshid6
- ベストアンサー率88% (591/669)
・TOP 4となっていますが、3つしかないのは3レコードしかないからですか? ・TOP 4はORDERがついていますか?それとも任意の先頭4レコードですか?
お礼
補足が中途半端でした。 すみません。 ・TOP 4となっていますが、3つしかないのは3レコードしかないからですか? ⇒こちらについては補足で説明させて頂いたとおりですが、 実際には8件ほどしかなく、8件分を列にしたいと思っています。 (なので、細くのレコード数は多すぎです。) ・TOP 4はORDERがついていますか?それとも任意の先頭4レコードですか? ⇒ORDERはあります。 例には書き忘れていましたが、 Aのテーブルには別のアイデンティティのIDがあり、 それでソートしようとしています。
補足
すみません。 Aのテーブルには その後、最初の3件と同じようなデータのレコードが続きます。 Aテーブル (列名 AA AB AC) AA1 AB1 AC1 AA2 AB2 AC2 AA3 AB3 AC3 ・ ・ ・ AA100 AB100 AC100 ・ ・ ・ という、感じです。
お礼
自分の環境でも正常に動き、 期待していた結果となりました。 ご丁寧に答えてくださり、 ありがとうございました。 またのとき、よろしくお願いします。