• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:group byの並び順を変えるだけで結果が異なる)

group byの並び順を変えるだけで結果が異なる原因を考える

bin-chanの回答

  • ベストアンサー
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

#1です。 うーん、不思議ですね。主キーはなんでしょう? 検証できる環境が手元にないのですが、やはり#1の最後に書いたように  MINUS前後を別SQLにして、キー項目だけで考えてみては? SUMをしないでT1.COL5を素直にSELECTさせてみるのが良いと思います。 実は何か別テーブルと結合してるとか?

evaag777
質問者

お礼

ご回答ありがとうございます。 最終的には、SQLを色々つくりかえる事にしました。 どうも、ありがとうございました。

evaag777
質問者

補足

ご回答ありがとうございます。 >うーん、不思議ですね。主キーはなんでしょう? SELECTで抽出している項目の一部が主キーです。 COL1、COL2など。 >MINUS前後を別SQLにして、キー項目だけで考えてみては? MINUS結合前後を別々にして、 INSERT SELECT ・・ で、それぞれ別々のテーブルに出力しましたが、 それぞれのテーブルを見ると差分があります。 たた、SELECTした結果をそのままオブジェクトブラウザーなどで見ると、 登録した時に差分のあったデータに対して、差分がなくなりました。 つまり、MINUSやINSERT SELECTでは差分があるが、 データを直接見ると、該当データには差分がなかった。 それと、もう1点 minus結合の前後で、where 句で差分のあるデータのみに絞って minus結合すると差分がなくなります。 つまり全体では、差分が発生するのに、 差分のあるデータのみに絞ってminus結合すると差分がなくなる。 (出力結果が非常に不安定で、なぜこのように変わるのか分かりません) SUMしないでSELECTする件ですが、試せていません。次回試します。 >実は何か別テーブルと結合してるとか? 他のテーブルとも結合してます。 SQLは抽出項目などももう少し多く、長いため、簡略化して書いてました。 結合ですが、exists結合を2つしてます。 ----(抜粋)----- FROM TABLE1 T1 WHERE EXISTS (SELECT 1 FROM TABLE2 T2) WHERE T1.COL1 = T2.COL1 AND T2.DAT2 = 'xxx') EXISTS (SELECT 1 FROM TABLE2 T2 ,TABLE3 T3) WHERE T1.COL2 = T3.COL2 AND T1.COL3 = T2.COL3 AND T2.DAT3 BETWEEB 'a001' AND 'a009' ----------------

関連するQ&A

  • SQLServerのGROUP BYについて

    SQLServerでGROUP BYを使用してデータをSELECTする場合について質問があります。 GROUP BYを行う項目に’△△1’と’1△’というデータが入っていた場合、   ※上記の△は半角スペースです。 ’△△1’と’1△’は同じグループとして、グルーピングされるのでしょうか。 Oracleにデータを移行して、GROUP BYをかけると上記のケースはデータ件数が異なります。 これはSQLServerの仕様なのでしょうか。(バージョンは2000です。) お手数ですが、ご教示願います。 

  • oracleでwith句の結果を使ってupdate

    oracleでwith句の結果を使って外部結合?でupdateしたいのですが 上手くいきません。 oracleでは無理なのでしょうか。 よろしくお願いいたします、。 /*---------- with v1 as ( select row_number() over(PARTITION BY ・・・ ORDER BY ・・・) as rnum ,no ,col1 ,・・・ from ・・・ ) update ( select A.col1 A_COL, v1.col2 B_COL from table1 A inner join table2 B on A.cd1=B.cd1 inner join v1 on A.no=v1.no where v1.rnum=1 and ・・・ ) set A_COL=B_COL ; ----------*/ と書いたのですが、 実際に実行してみると、 カッコ「(」、「)」がないとか、 selectが必要とか, A_COLやB_COLが無効ですとか、 となります。 どこが悪いのでしょうか。 oracleではupdateでwithは使えないのでしょうか。 よろしくお願いします。

  • GROUP BY句について

    SQL_PLUSでの質問です。 以下のSELECT句があります。 GROUP BY句の『'A' AS 区分』は必要なのでしょうか。 ----------------------------- SELECT 商品コード AS 商品コード, 商品名 AS 商品名, 'A' AS 区分, SUM(金額) AS 金額 FROM 売上トラン GROUP BY 商品コード AS 商品コード, 商品名 AS 商品名, 'A' AS 区分; ----------------------------- 何気なくプログラムを見ていたら、目に留まりました。 このままでもコンパイルは通るので問題はないのですが、 決まった値を設定しているのだから、必要ないような気がするのです。 環境はWin2000 Oracle 9i です。 ご存知の方、教えて下さい。

  • [MYSQL] GROUP BY による結果レコードの取得について

    こんにちは。 今回は MYSQL の GROUP BY によって、複数レコードのグループ化を行った場合についてお尋ねしたいです。 id, val という二つのフィールドをもつテーブルがあったとして、複数レコードに対して、id でグループ化を行うとします。 その時、val の合計を求めたいのですが、 SELECT id,SUM(val) FROM tablename GROUP BY id となる SQL構文により SUM(val) を取得します。 この場合、SUM(val) を降順にソートした結果レコードを得ることはできますでしょうか? 通常は ORDER BY を用いてこれを行うと思うのですが、このケースではよくわかりません。 また、PEAR によって、これらの結果レコードを連想配列で取得しようと思っています。 結果レコード $rs に対して、 $data = $rs->fetchRow(DB_FETCHMODE_ASSOC); とすると、 $data の連想配列のキーが SUM(val) となってしまいます。 変数に括弧が含まれるのは具合がよくないので、これらを回避する方法はありませんでしょうか? 以上2点おわかりの方がいればお答えいただけないでしょうか。

    • ベストアンサー
    • PHP
  • group by句

    色々と試行錯誤してやっていますが、なかなか自分の 思うような結果が得られないためご質問させて下さい。 テーブルが全部で3つあります。 テーブルA id name 1 巨人 2   西武 テーブルB id name 1 小笠原 2 ラミレス 3 中島 4  片岡 テーブルC id テーブルAID テーブルBID 背番号 1 1 1 30 2 1 2 10 3 2 3 3 4 2 4 8 テーブルを結合し、テーブルCにある 背番号をテーブルAid,テーブルBidを元に sumしたいのですがうまくいきません。 以下がそのSQLになります。 (1)サブクエリーを使ったSQL この場合値が重複されて表示されてしまいます。 select a.name,b.name,c.name, (select sum(背番号) from tableC c where c.テーブルAId = a.id group by c.テーブルAid ), (select sum(背番号) from tableC c where c.テーブルBid = bid group by c.テーブルBid ) from tableC c inner join tableA a on a.id = c.テーブルAid inner join tableB b on b.id = c.テーブルBid (2) select a.name,b.name,c.name, (select sum(背番号) from tableC c where c.テーブルAId = a.id ), (select sum(背番号) from tableC c where c.テーブルBid = bid ) from tableC c inner join tableA a on a.id = c.テーブルAid inner join tableB b on b.id = c.テーブルBid group by c.テーブルAid 重複はされないのですが、group byが一つのみなので ちゃんとした出力がされません。    他にやり方があるのかもしれませんが、お分かりになる方が    いらっしゃいましたら、ご教授お願い致します。

  • group by したものをsumしたのですが方法がわかりません。

    ある情報をgroup byしその数をcountし、そのcountした数をsumしたのですがどのようにすればよろしいでしょうか? 例えば DB名 test a | ------ ABA | A | AA | ABA | select a,count(*) count from test group by a; a |count| ------------- ABA | 2 | A | 1 | AA | 1 | このカウントの数字を一回でsumすることは可能でしょうか? 宜しくお願いします。

  • GROUP BY で列名は指定できないの?

    いつもお世話になっております。 SQLで GROUP BY を使うときに SELECT部分で指定した 列名を指定したいことがよくあると思います。 列名を指定する方法はないのでしょうか? 例) SELECT 項目A, CASE WHEN 項目B = 1 THEN '○' WHEN 項目B IN (2,3) THEN '×' END AS 丸バツ, SUM(数量) FROM TABLE GROUP BY 項目A, 丸バツ こんな風にGROUP BYで指定したいのですが・・・。

  • MysqlのONLY_FULL_GROUP_BY

    MySQLの5.7.9でONLY_FULL_GROUP_BYを有効にしています。 3つのテーブル(a, b, m) を結合して以下のようにgroup byした際、with rollupを付けるとエラーになります。rollup なしでは通ります。これは正しい挙動でしょうか。 select a.aid, a.name, b.bid, sum(m.value) from a inner join b on a.aid = b.aid inner join m on m.bid = b.bid group by a.aid, b.bid a.aid, b.bid はいずれもprimary keyです。 with rollup時のエラーは"SELECT list is not in GROUP BY clause and contains nonaggregated column a.name functionally dependent on columns in GROUP BY clause"という内容ですが、a.nameはテーブルの定義上a.idによって一意に決まる値です。

  • グループの結果を制限して、明細を出力したいのですが

    タイトルで上手に表現するのが難しいのですが。 以下の事を実現したいと思います。 項目   COL1  COL2   COL3 ----------------- 値    A    1    ア      A    2    イ      A    2    ウ      B    1    エ というようなデータの場合、 COL3の件数が複数のCOL1とCOL3を取得したい時 (上記の例では[A,ア],[A,イ],[A,ウ]) 以下のSQLを組むと取得できると思います。 (他にもっと良い方法があったらそれも教えていただきたいのですが) SELECT COL1,COL3 FROM テーブル名 WHERE COL1 IN (SELECT COL1 FROM テーブル名 HAVING COUNT(COL3) > 1 GROUP BY COL1) ところが、副問合せ中でグループ化する列を複数で行おうとするとうまくいきません。 (上記の例で言うと、COL1とCOL2をグループ化して、2行目と3行目の明細を取得したいのですが) どなたか方法を教えてください。 DBMSはORACLE9iです

  • GROUP BYの記述方法について

    GROUP BYの記述方法について教えてください --------------------- 受注データ(テーブル) --------------------- 品目CD 受注数 00001  10 00001  10 00002  20 00002  15 --------------------- 品目マスタ(テーブル) --------------------- 品目CD 品目名 00001  えんぴつ 00002  けしごむ 00003  色鉛筆 上記二つのDBから、品目ごとの受注数の合計を取得するときのSQL文として、どうするのが正しいのでしょうか? --------------------- 欲しい結果 --------------------- 品目CD 品目名  受注数 00001 えんぴつ 20 00002 けしごむ 35 (考えられるSQL) CASE1:受注データの品目CDと品目マスタの品目名のグループ化 SELECT A.品目CD, B.品目名, SUM(A.受注数) FROM 受注データ A, 品目マスタ B WHERE A.品目CD = B.品目CD GROUP BY A.品目CD, B.品目名 CASE2:受注データをグループ化した結果と品目マスタを結合 SELECT X.品目CD, X.受注数合計, Y.品目名 FROM  (SELECT 品目CD, SUM(受注数)   FROM 受注データ   GROUP BY 品目CD)X,品目マスタ Y WHERE X.品目CD = Y.品目CD CASE3:品目マスタの品目CDと品目名のグループ化 SELECT B.品目CD, B.品目名, SUM(A.受注数) FROM 受注データ A, 品目マスタ B WHERE A.品目CD = B.品目CD GROUP BY B.品目CD, B.品目名 レスポンスも含めて教えてください。 よろしく、お願いします。