-PR-
  • 困ってます
  • 質問No.7612453
解決
済み

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

  • 閲覧数1350
  • ありがとう数1
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 51% (88/172)

Oracleバージョン10 です。

group byの項目の並び順を変えると結果が異なるのですが、何か原因は考えられるでしょうか?
例えば以下のSQL
------------------
SELECT
T1.COL1,
T1.COL2,
T1.COL3,
TRUNC(T1.COL4,'MONTH') COLM,
SUM(T1.COL5)
FROM
TABLE1 T1
GROUP BY
T1.COL1,
T1.COL2,
T1.COL3,
TRUNC(T1.COL4,'MONTH')

MINUS

SELECT
T1.COL1,
T1.COL2,
T1.COL3,
TRUNC(T1.COL4,'MONTH') COLM,
SUM(T1.COL5)
FROM
TABLE1 T1
GROUP BY
TRUNC(T1.COL4,'MONTH'),
T1.COL1,
T1.COL2,
T1.COL3
------------------

このMINUS結合の結果でデータ(差分)が出力されます。
MINUS結合の前と後で違いがあるのは、GROUP BYの並び順のみです。

TRUNC関数を記載してますが、どうもこのTRUNC関数を除くと、
差分が出力されなくなるようです。
(TRUNCを辞めて、ただのT1.COL4 にした場合)
なので、TRUNC関数が何か関係してるかも知れません。

原因が分かりません。オラクルの障害が何かなのかも知れません。
何か原因は考えられるでしょうか?
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル14

ベストアンサー率 33% (1403/4212)

#1です。
うーん、不思議ですね。主キーはなんでしょう?
検証できる環境が手元にないのですが、やはり#1の最後に書いたように

 MINUS前後を別SQLにして、キー項目だけで考えてみては?

SUMをしないでT1.COL5を素直にSELECTさせてみるのが良いと思います。


実は何か別テーブルと結合してるとか?
補足コメント
evaag777

お礼率 51% (88/172)

ご回答ありがとうございます。

>うーん、不思議ですね。主キーはなんでしょう?
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'
----------------
投稿日時 - 2012-07-29 00:40:56
お礼コメント
evaag777

お礼率 51% (88/172)

ご回答ありがとうございます。
最終的には、SQLを色々つくりかえる事にしました。
どうも、ありがとうございました。
投稿日時 - 2012-08-25 00:57:45
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル14

ベストアンサー率 33% (1403/4212)

> 並び順を変えると結果が異なるのですが 何がちがうの?SUMの結果?レコード行数? レコードの行数が異なっても、SUMの総合計は一致しそうなものですが。 > TRUNC(T1.COL4,'MONTH') COLM 日付型の列から '月' を取り出そうとしてるんでしょ。 異なる年or日で同じ月のレコードがあるんじゃない? MINUS前後を別SQLにし ...続きを読む
> 並び順を変えると結果が異なるのですが
何がちがうの?SUMの結果?レコード行数?
レコードの行数が異なっても、SUMの総合計は一致しそうなものですが。

> TRUNC(T1.COL4,'MONTH') COLM
日付型の列から '月' を取り出そうとしてるんでしょ。

異なる年or日で同じ月のレコードがあるんじゃない?
MINUS前後を別SQLにして、キー項目だけで考えてみては?
補足コメント
evaag777

お礼率 51% (88/172)

解答ありがとうございます。

>何がちがうの?SUMの結果?レコード行数?
異なるのはSUMの結果です。レコード行数は同じです。
元テーブルには、ある同じ年月日でレコードが2件あります。

(例) -------------
COL4     COL5
2011/09/01  100
2011/09/01  200
------------------
結果の1つは、合計値(300)を返し、もう1つは片方のみ(100)を返してます。
その為、minusで差分が出てます。
本来、合計値(300)を返してほしい。


>日付型の列から '月' を取り出そうとしてるんでしょ
'MONTH'で指定することで、'年'および'月'で取り出そうとしてます。
’年月’を基準にしてます。

もっとも分からないのは、結局group byの項目順番を変えてるだけなんですが、
それが結果に影響する事があるのでしょうか?
投稿日時 - 2012-07-27 02:13:20
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ