行列の変換 - SQL SERVER 2005

このQ&Aのポイント
  • 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
回答を見る
  • ベストアンサー

行列の変換

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があれば、教えて頂きたく思います。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

>SELECT ROW_NUMBER() OVER (ORDER BY ID) SEQ,* FROM TABLE ROW_NUMBERは分析関数と呼ばれますが、 「ROW_NUMBER () OVER (ORDER BY ID)」と書くことで、戻りのレコードをID別に並び替えた場合の連番を返してくれます。 これをメインのクエリで使うために、私が勝手に「SEQ」という名前をつけているとご理解ください。

loop_dog
質問者

お礼

自分の環境でも正常に動き、 期待していた結果となりました。 ご丁寧に答えてくださり、 ありがとうございました。 またのとき、よろしくお願いします。

その他の回答 (2)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

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列 が返ってくるようなビューをイメージされているのであれば、それは不可能です(ビューの列数は固定です)。 どうしてもそのようなことをしたい場合は、ストアドプロシージャを使うことになります。 (ただし、ビューより結果の使い勝手は相当劣りますので、期待したものにはならないでしょう)

loop_dog
質問者

お礼

ありがとうございます。 ところで、回答の FROM (SELECT ROW_NUMBER() OVER (ORDER BY ID) SEQ,* FROM TABLE) t の、SEQの部分なのですが、 これはシステムの予約語でしょうか? だとしたら、SQL SERVERに用意されているもなのでしょうか?

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

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

loop_dog
質問者

お礼

補足が中途半端でした。 すみません。 ・TOP 4となっていますが、3つしかないのは3レコードしかないからですか? ⇒こちらについては補足で説明させて頂いたとおりですが、 実際には8件ほどしかなく、8件分を列にしたいと思っています。 (なので、細くのレコード数は多すぎです。) ・TOP 4はORDERがついていますか?それとも任意の先頭4レコードですか? ⇒ORDERはあります。 例には書き忘れていましたが、 Aのテーブルには別のアイデンティティのIDがあり、 それでソートしようとしています。

loop_dog
質問者

補足

すみません。 Aのテーブルには その後、最初の3件と同じようなデータのレコードが続きます。 Aテーブル (列名 AA AB AC) AA1 AB1 AC1 AA2 AB2 AC2 AA3 AB3 AC3 ・ ・ ・ AA100 AB100 AC100 ・ ・ ・ という、感じです。

関連するQ&A

  • 別テーブルの検索した結果が0件のデータのレコードを削除したい

    SQL Server 2005 を使用しています。 別テーブルで検索した結果が0件の時、対応するレコードを削除したいのですが、SQLをどうかけば実現出来るかわかりません。 具体的には、テーブル Aとテーブル B があって、テーブル Aのキーが AA,AB,ACとします。 この時、テーブル Bにも AA,AB,ACという列があるとします。 この時に、テーブルBをAA,AB,ACでGROUP BYしてCOUNTをとった時にレコード数が0のキーのレコードを、テーブルAから削除したいのですが、この時SQLを一つで書きたいのです。 テーブル Aが明細、テーブル Bが名簿みたいな形で、名簿に存在しないレコードを削除するような感じです。 どういうSQLを書けばいいか少し悩んでいます。 AA,AB,ACは全て integer型です。 どなたかわかりましたら教えてください。

  • SQLについて教えてください

    お世話になっております。 以下、取得したい内容です。 この内容に対して、どのようにSQLを書けばよいか良いか教えて頂きたいです。 (1)DBの全テーブルに対して特定のカラムを取得したい。(カラム名はA,Bとする) (2)取得したカラム.Aに格納されている各値に対して、カラム.Bの各レコードの項目には何の値が格納されているか知りたい。 DBはオラクルですが、オラクルでしか使えないSQL構文はつかないようにしたいです。 自分で考えたSQLは、 SELECT A,B FROM * GROUP BY A,B ですが、そもそも全テーブルを指定する際に使用するのが、「*」では正しくないような気もします。 説明がつたなくて申し訳ございません。 宜しくお願い致します。 ・テーブルイメージ テーブル.test1 +--------+------+ | No | A | B | +--------+------+ | 01 |AA| 1 | | 02 |AA| 1 | | 03 |AB| 2 | | 04 |AB| 2 | | 05 |AC| 3 | | 06 |AC| 3 | | 07 |AC| 3 | +--------+------+ テーブル.test2 +--------+------+ | No | A | B | +--------+------+ | 01 |AA| 1 | | 02 |AA| 1 | | 03 |AB| 2 | | 04 |AB| 2 | | 05 |AC| 1 | | 06 |AC| 3 | | 07 |AC| 3 | +--------+------+ テーブル.test3 +--------+------+ | No | A | B | +--------+------+ | 01 |AA| 3 | | 02 |AA| 1 | | 03 |AC| 2 | | 04 |AC| 3 | +--------+------+

  • クエリビルダで列名を変数にしたいが

    VisualStudio2010でwebアプリを作成しています。 クエリビルダでSQL文を作成しSQLサーバにアクセスしています。 このSQL文でわからない点があります。 列1、列2、列3のフィールドを持つテーブルがあるとします。 ドロップダウンリストで選択した項目により、ある時は列1だけ取得し ある時は列2だけ取得し、ある時は列3だけ取得する様なSQL文を作りたいのですが、どうすればよいかわかりません、列名を変数にできればよさそうなんですが、そんなことできますか? ある時は SELECT 列1 FROM table1 ある時は SELECT 列2 FROM table1 ある時は SELECT 列3 FROM table1 としたいので   SELECT @列名 FROM table @列名は変数のつもりです。 このようにできればよいと思っていますが・・・ よろしくおねがいします

  • アクセスでこんなふうにできますか?

    あるテーブルAがあるとします。そこには店舗ごとに納入している商品名が色ごとにコード分けされているもの(AA、AB、AC・・・)が入力されているのですが、各店舗商品一個につき一つの行を使っています。同じ商品があれば同じ商品コードが2行出てくる内容です。 (例) 店舗コード   ,商品コード 0123       AA 0123       AA 0123       AC 0456       AC 0456       AB このテーブルを、店舗コードをひとまとめにして、商品コードを下記のようにしたいのです 店舗コード   ,商品コード 0123       AA2,AC1 0456       AB1,AC1 これってクエリとかで出来るんですか?普通に集計クエリを使っても商品コードの種類が違うのでうまくできません。

  • OracleのViewの作り方

    OracleのViewについてですが。。 ‘あ行’という名前のテーブルと‘か行’という名前のテーブルがあるとします。 ‘あ行’テーブルには‘あ’,‘い’,‘う’という列名があり、 ‘か行’には‘か’,‘き’,‘く’,‘あ’,‘い’という列名があるとします。 以上の2つのテーブルから‘ひらがな’というViewを作りたいとします。 このViewの条件としては‘あ行’から‘あ’,‘い’をselectし、‘か行’からは‘あ行’と‘か行’のそれぞれの‘あ’列の項目が同じであるレコードから‘か’と‘あ’と‘い’をselectしてきます。この時‘あ’という列の項目内容は分かっていて、その項目が記載してあるレコードに‘い’の項目内容をupdateしたいとするとどのようにViewを書けばよいのでしょうか?あくまでもそれぞれのテーブルに直接‘い’項目を書くのではなくてViewにおいてUpdateで書きたいのですが。

  • Access@クエリで特殊なカウントについて

    Accessのクエリで次のような場合のカウント方法を教えて下さい。 1AA111 1AA112 1AB111 1AC111 1AC113 1AC114 上記のような列があり、この列から前3文字が同じものをカウントしたいのですがどうすれば良いでしょうか? 結果の例 1AA 2 1AB 1 1AC 3 Likeを使うのだろうと予想はできるのですが、うまくいかないので教えて下さい。 宜しくお願いします。

  • Oracleでルールベースでの複合索引

    数十万件のデータをバッチ処理を行っているのですが、パフォーマンスが悪く困っています。 その原因となりそうな部分について質問します。 テーブルAに複合索引を作ります。 create unique index uk_A on A(AA,AB,AC,AD); このテーブルに検索をかけます。そのときにWhere句に書く列の順序は、パフォーマンスには関係ないのでしょうか? select max(AD) from A where AA=1 and AB=2 and AC=3; としたときと select max(AD) from A where AC=3 and AB=2 and AA=1; としたときの、パフォーマンスの違いです。 このバッチ処理の中で、Aのテーブルに多数のデータを追加するために、コストベースにはできません。また、このSQL文は、プロシージャの中で使用しています。 範囲検索の場合のことは、講習でもあったのですが、等価結合のことは出てきませんでした。 どなたかご存知の方宜しくお願いします。

  • エクセルの関数について

    下記のようなことが関数で出来ますか? A1セルに「AA AB AC AD AE」というデータがあったときに、 B1に、A1に「AB」か「AC」という文字列があればそれを取り出す。なければブランク(もしくは#N/A) かつ優先順位もつけたい。 (「AB」も「AC」もある場合は「AB」) 「AA」と「AB」の間など、文字間は必ず半角スペースがあいている状態です。 具体的な例は↓の画像のような感じです。 かなり高度だと思うんですが、関数で実現できますでしょうか? よろしくお願いします。

  • MS Access 複数文字列の置き換えについて

    アクセスはデザインビューでクエリを組むことができる程度の初心者です。 できればSQLを直接いじらずにもできる方法でお教え頂ければ幸いです。 1つのテーブル内に30種類の文字を置き換えたい列が10個あります。 置き換えたい列A~Jには、それぞれ異なるデータが入っていますが、置き換えたい内容は同じです。 01~30までの数値をそれぞれ対応する文字あ~ほに置き換えたい列が10個あるということです。 クエリを組んでreplaceやswitchを使うには式が長すぎると怒られてしまいますし、変換用のテーブルを作ろうにも置き換えたい列が10個もあるのでうまく繋げません。 変換用テーブルを10個作ればできるのかもしれませんが、さすがにそこまで無駄なテーブルは作るのは抵抗があります。 何かスマートな方法があればと探しています。 よろしくお願い致します。

  • SQLで○○の値以外を持っているレコードを抽出しないという条件を作りた

    SQLで○○の値以外を持っているレコードを抽出しないという条件を作りたいのですが・・・ 例えばこんな感じのテーブルがあったとします。 A1 A2 A3 -- -- -- AAA AA 111 AAA AB 111 AAA BB 222 BBB BB 111 CCC AA 111 CCC AC 555 DDD BB 222 EEE AA 111 EEE AC 333 EEE BB 777 A2の列に「BB」の値"しか"持っていないレコードを抽出したいのです このテーブルで言えば返りは BBB BB 111 DDD BB 222 と期待しています。 値BBのみしか持ってない条件の作り方を御教示願えませんでしょうか。 また、A2の値も文字数以外は規則性があるわけではないので無限パターンです。 詳しい方よろしくお願いします。