dポイントプレゼントキャンペーン実施中!

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関数が何か関係してるかも知れません。

原因が分かりません。オラクルの障害が何かなのかも知れません。
何か原因は考えられるでしょうか?

A 回答 (2件)

#1です。


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

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

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


実は何か別テーブルと結合してるとか?

この回答への補足

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

>うーん、不思議ですね。主キーはなんでしょう?
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
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/08/25 00:57

> 並び順を変えると結果が異なるのですが


何がちがうの?SUMの結果?レコード行数?
レコードの行数が異なっても、SUMの総合計は一致しそうなものですが。

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

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

この回答への補足

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

>何がちがうの?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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A