• ベストアンサー

データを同データが並ばないように並び替える

こんにちは。 顧客からの質問で、どういう目的かはわからないのですが、あるカラムの中にさまざまな種類のデータがあります。それをソートの意味の逆、ばらばらに並び替えたいのでそのようなSQLを考えてほしいといわれました。 具体的に言いますと monthカラム ------------- 01 01 02 02 02 03 04 04 とあるテーブルを、SQLを発行してバラバラにする ↓ monthカラム ------------- 01 02 04 01 02 03 02 04 のようにしたいのです。バラバラにした時に一つ前のデータと一つ後ろのデータと重複しないようにすればO.K.です。 どうかよき知恵がありましたら教えてください。DBはサイベースです。

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

  • ベストアンサー
  • mojimojio
  • ベストアンサー率51% (14/27)
回答No.4

monthカラムの他に必ずあるはずのID(プライマリキー)を利用すれば、仮想連番を取得できると思います。 idという名前の一意なフィールドがあるとすれば、こんな感じです。 select month, (select count(*) from hoge t2 where t2.id <= t1.id and t1.month = t2.month) as rownumber from hoge t1 order by rownumber; ただし、適当なIDがなくてプライマリキーが複数のカラムからなっていた場合が問題かも。

jew_ish
質問者

お礼

mojimojioさん、回答ありがとうございます。 なるほど、助かります。こんなSQLはまだまだ思いもつかなかったです。。。。 対象となるデータについては、明日ではないと(←担当の人間がお休み)、詳細なところまではわからないのですが、プライマリーキーがあればかなり有効な手立てになることまちがいなしです。勉強になります。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.3

仮想連番をSQL文だけでつけるのは無理だと思います。 乱数を持ち込んでも問題の解決にはなりません。 (前のグループの乱数が全て、次のグループの乱数より大きいなんて事も起こります) プログラムを介入させるか、データ数が少なければ人手で入れるかしか有りません。 蛇足ですが、どれかのグループのデータ数が全体の半数を超えていると、どんなにしても、バラバラにはなりません。

jew_ish
質問者

お礼

ymmasayanさん、回答ありがとうございます。 サイベースのユーザーガイドを一日中読んで、単純なSQLでは無理だと理解しました。 又、サイベースのバッチファイルがありまして、その中で条件文、ローカル変数でプログラムを書けば可能では??と今は模索しています。 > どれかのグループのデータ数が全体の半数を超えていると、どんなにしても、バラバラにはなりません。 よく考えるとそうですよね。。。一応、バラバラにできることを前提に行います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • madman
  • ベストアンサー率24% (612/2465)
回答No.2

ランダムだと意図したならびにならずに、前後に同じ数字が来る可能性があります。 仮想連番を同じ数値のデータ内でランダムに作成すればよいのかもしれませんね。 01  01 01 01 01 --この01のデータ内でランダムに仮想連番をつける。 02 02 --この02のデータ内でランダムに仮想連番をつける。 データを作る上では、連番のほうが処理しやすいとは思いますが。 ランダム関数以外は、知らないですね。 プログラムをかぶせて良いのなら、方法はるかもしれませんが...

jew_ish
質問者

お礼

回答ありがとうございます。 データベースに触って1ヶ月も経ってないので、大変助かります。 しかし、どのように書いたらいいか、1時間考えたのですが全然わかりません。 すいませんが、SQL文を教えてくださいませんでしょうか?ランダムではない仮想連番をつける方法を。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • madman
  • ベストアンサー率24% (612/2465)
回答No.1

直接の答えではないですがアイデアを。 同じ情報のデータに連番を付加し、その連番でソートする。 DBで仮想TABLEが作れるのか良く知りませんので、できるかどうかは解りませんが、ORDER BY で仮想連番、MONTHとすれば、バラけさせるのは簡単です。 1 01 2 01 1 02 2 02 3 02 1 03 1 04 2 04 ↓ 1 01 1 02 1 03 1 04 2 01 2 02 2 04 3 02

jew_ish
質問者

お礼

madmanさん、お早い回答ありがとうございます。 一カラム挿入して、その中にランダム関数で番号を付加してそれをソートすればいいかなぁっておもいました。 仮想連番というのは、ランダム関数以外で作る方法はありますかね?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SQL内でのデータコピー

    おはようございます! 今私が扱っているSQLデータであるコラムデータを違うコラムに移行したいのですがその方法が分かりません。 このSQLデータは「顧客」テーブルと言うものがあり、 「顧客」テーブルの「コメント」と言うコラム内データを「ノート」というコラムに移動したいです。 「顧客ID」があるので 「顧客ID」が同じという条件で 「顧客」テーブルの「コメント」内データを、「顧客」テーブルの「ノート」内に移動する 為にはどう言った構文を作成すればよろしいのでしょうか? かなり切羽詰まっているので宜しくお願いします!

  • 複数のテーブルからデータを取得したい

    1つのテーブルから重複したデータを取り除いて表示するときに使う 【select distinct カラム名 from テーブル名;】 がありますよね。 それと同じようなことを複数のテーブルをまたいで行いたいのですがうまくいきません。 ちなみに両方のテーブルのカラム名は同じです。 【select distinct カラム名 from テーブル1 union select distinct カラム名 from テーブル2;】 としても重複を取り除いた後にテーブルを結合してるので結果的に両テーブルの重複した値を取り除くことができず。 そこで 【select distinct T1.カラム名, T2.カラム名 from テーブル1 T1. テーブル2 T2;】 としてみたのですが、クエリを実行中のまま反応がないので悩んでます。 ちなみに2つのテーブルのデータはそれぞれ2万件ほどです。 こういう時どういうsql文を組むのが正しいのでしょうか?

    • ベストアンサー
    • MySQL
  • 重複しないデータの抽出について

    MYSQL5.0.77で DBをつくり テーブル1のAフィールドのデータから テーブル2のAフィールドのデータ、 テーブル3のAフィールドのデータ、 テーブル3のAフィールドのデータ、 のいずれにも重複しないデータのみ 抽出したいと思っています。 どのようなSQL文を書けばよいでしょうか? じぶんでいろいろ試しましたがどうしても出来ません。 どなたかご教授願います。

    • ベストアンサー
    • MySQL
  • SQL 同テーブル、同フィールドの文字列連結

    以下の様にSQLで実現したいと思っております。 なお、DBはOracle10Gを利用しております。 親と子テーブルがあり以下の構成となっております。 ■親テーブル  ID,カラムA  1 ,AA  2 ,BB  3 ,CC ■子テーブル  ID,枝番,カラムB  1 ,1 ,あああ  1 ,2 ,いいい  2 ,1 ,ううう  2 ,2 ,えええ  2 ,3 ,おおお  3 ,2 ,かかか ※IDカラムは親テーブルと子テーブルは1:1です  子テーブルの枝番カラムはIDに対してN件です。 やりたい事としては、上記の2テーブルより、以下の結果を出力したいです。  ID,カラムA,カラムB  1 ,AA ,あああ いいい  2 ,BB ,ううう えええ おおお  3 ,CC ,かかか 親テーブルを元にして、 親テーブルに紐づく子テーブルのカラムBを連結して出力 するSQLをご教授いただけますでしょうか

  • オラクルからAccessにデータ追加

    オラクルから、必要なデータを抜出し加工の為のDBをAccessで作成していますが、オラクルから抜き出したデータ(レコードセット)を、どうやってAccessのテーブルに書き込めばよいかがわかりません。 ◎環境 Oracle:10g Access:2010 ◎現在の状況 Dim CON As New ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String Dim i As Integer 'DB接続定義 CON.Open "DSN=DNS名;UID=ユーザー名;PWD=パスワード;" 'SQL文 SQL = "SELECT " SQL = SQL & "カラム1," SQL = SQL & "カラム2," SQL = SQL & "カラム3" SQL = SQL & "FROM オラクルテーブル名 " SQL = SQL & "WHERE 抽出条件 " SQL = SQL & "AND 抽出条件" SQL = SQL & "GROUP BY カラム" SET RS = CON.EXCUTE(SQL) For i = 1 To 10 Debug.Print rs(カラム1) & rs(カラム2) next i ここまでは、オラクルのテーブルから、レコードセットにデータが取り込まれてます。 rs.close: SET RS = Nothing con.close:SET CON=Nothing end sub 案1 レコードセットのデータを、Access側のテーブルにループで回して、1行ずつデータ追加 案2 INTO句で直接、テーブル作成 調べていて、2通りのやり方があると思うのですが、どちらにしても、テーブルへの書き込み方がわかりません。 案1の場合、Access側のテーブルを開いてデータ追加する方法 ※同時に2つのテーブルを開くことになるのでは? 案2の場合、SQL文はオラクルで処理する為の物なので、AccessテーブルのINTO句が使えるのか? オラクルのテーブルをリンクする事も考えたのですが、実際動かすPCにはAccessRuntimeしかインストールしてませんので、オラクルのテーブルをリンクしてくれませんでした。 よい方法があれば、アドバイスを頂けたら幸いです。

  • データの持ち方について

    一般的に、DB(MySQL)へは、何を入れるのでしょうか? PHPで計算可能なものは、なるべく入れない方がいいのでしょうか? 例:年齢を表示させたい場合、DBへ入れておく値 1.誕生日(から計算) 2.年齢 3.何も入れない(別データからPHPで計算可能な場合) なるべくDBへデータを保持しない方がいいのかな? と思い、今回、3でやってみました。 具体的には、mysql_fetch_arrayとかで、データを取り出し、 そこから色々計算して年齢を割り出し、表示させてみたのですが、 DBとPHPを使って色々やるんだったら、 初めから素直にDBへデータを入れといて、 そこから、取り出した方が、 いいのかな? とも思いました。 一般的に、DBへ入れなくても、 (計算等によって)取得できる値については、 やはり、DBへ入れない方がいいのでしょうか? また、ちょっと別件なのですが、 例えば、DBからデータを取り出して、 ソートして表示させたい際、 3つぐらい方法を思いつくのですが、 一般的には、どんな感じで実装するのでしょうか? 1.SQL文でソートをかけて取り出す 2.SQL文で取り出した後、ソート部分はPHPで行う 3.SQL文で取り出した後、ソートはJavaScriptで行なう 特にパフォーマンスを気にしているわけではないのですが、 普通、一般的に、どういう風に実装するのか分からず、質問してみました。 MySQLとPHPを使っている限りは、 余程大規模なサイトでなければ、この辺はあまり気にしなくてもよい感じでしょうか?

    • ベストアンサー
    • PHP
  • アクセス97で重複データを見つけたい

    アクセス97を使用しています。 テーブルの重複したデータを取得する方法はあるでしょうか? 取得して区別を付けたいのです。 例えば、下記のようなデータにチェックを付けたいのです。 データ チェック欄 1    ○  2    × 2    × 3    ○ 4    ○ 5    × 5    × 7    ○ クエリー又はSQLで実施したのですが可能でしょうか? 例えば 該当テーブルをデータをソートしてSELECTし 自データと次データの比較を全件行う ことを繰り返す。 という方法しかないのでしょうか?

  • 複雑な抽出条件のSQL文

    まだまだ初心者ですがよろしくお願いします。 以下の条件でDBからデータを抽出したい場合のSQLを 教えていただきたいです。 ・テーブルAがありカラムがA、Bとある。 ・Aは重複できないようになっているがBは重複可。 ・Bが重複しているレコードのAの値が欲しい。 環境はSQLServer2000+VB6.0です 情報が足りないかも知れませんがよろしくお願いいたします。

  • バイナリーの画像データを読み込む。

    データベースをサイベース社のAdaptive Server Anywhre 7と いうのを使用していて、そのDBのテーブルに、long binaryで画像データ の定義を切ってデータをバイナリで保存してあります。 (もとはBMPの画像をバイナリに変換している) 上記のバイナリデータをVBのフォーム上(イメージ)に表示させるには どのようにしたらいいのでしょうか? もちろん、Loadpicture句を使用するのでしょうが、通常はパスを切ったり して使用すると思うのですが。。 VB始めたばかりでまったく想像つきません。どうか教えてください! 別記:上記サイベースのDBで10回程度連続でDBを読み込みに行くと エラーになるのですが、DB上でそのような回数の指定があるのでしょうか? それとも、ハード的な問題なんでしょうか?いままでそのような経験が ありましたら対策等教えてください。お願いします!

  • MySQL,PHPを使いデータとデータ件数を取得する関数

    よろしくお願いします。 このようなテーブルがあります。 テーブル名GAME id name    price  genre_id  comment 1 FF1    100  1  おもしろい 2 カービー 200 3 丸い赤 3 バイオ   250 2 怖い : : : : : テーブル名GENRE genre_id genre_name 1 RPG 2 ホラー 3 バイオ このようなテーブルがあるとして、 検索したいカラム(id,name,g_id,comment)に対して検索キーワードに部分一致をしたものデータからソートしたいカラムと昇順降順のようにソートしページ数から (ページ数-1)*10+1 ~ ページ数*10 最終ページのときは (ページ数-1)*10+1 ~ 最終ページ の部分のデータを取得する関数を作りたいです。表示するデータは id name genre_name です。 ページャーも使うので検索カラムにたいして検索ワードに部分一致した結果件数も戻り値として返したいです。 上記のsql文を教えてください。 またデータと結果件数を返す関数を作ることは可能でしょうか? 関数の引数は以下のように5つにするつもりです。 function getList($search_column,$search_word,$sort_column,$sort_order,$page_number) どうかご教授ください。

    • 締切済み
    • PHP