
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関数が何か関係してるかも知れません。
原因が分かりません。オラクルの障害が何かなのかも知れません。
何か原因は考えられるでしょうか?
No.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'
----------------
No.1
- 回答日時:
> 並び順を変えると結果が異なるのですが
何がちがうの?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の項目順番を変えてるだけなんですが、
それが結果に影響する事があるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel 、この式はどのように解釈すればいいのでしょうか 4 2023/02/03 08:53
- その他(コンピューター・テクノロジー) Pythonの np.indicesに関する質問です。 2 2023/02/07 08:19
- JavaScript java keyを配列で表記したい 10 2022/12/01 17:53
- その他(プログラミング・Web制作) seleniumbasic chrome操作について 1 2023/03/29 15:40
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- WordPress(ワードプレス) Wordpress プラグイン Mail Form 7 のファイル添付の表示が切れてしまう 1 2022/03/24 09:05
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Excel(エクセル) Excelでこの式の意味をおしえていただけますでしょうか、またどのように理解したらいいのでしょうか 3 2022/11/18 00:11
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
このQ&Aを見た人はこんなQ&Aも見ています
-
GROUP BYを行った後に結合したい。
Oracle
-
SQLで部分的にGROUP BYしたいとき
Oracle
-
SELECT 文 GROUP での1件目を取得
SQL Server
-
-
4
3つ以上のテーブルをUNIONするのは現時的でないでしょうか?
MySQL
-
5
MAX関数を使ってからLEFT JOINしたいのですが・・
PHP
-
6
CloseとDisposeの違い
Visual Basic(VBA)
-
7
select句副問い合わせ 値の個数が多すぎます
Oracle
-
8
datetime型でNULL値を入れたい。
SQL Server
-
9
【DB】同じトランザクション内でupdateとselectをしたときの結果値
その他(データベース)
-
10
文字列として(ダブルコーテーション)を表示させる方法"
Excel(エクセル)
-
11
Form_Load と Form_Activate のタイミング
Visual Basic(VBA)
-
12
SQL>UPDATEと同時にその件数をCOUNTする方法
その他(データベース)
-
13
SQL 全角半角混在の文字列から半角数字のみを抜き出す
Oracle
-
14
SQLで特定の項目の重複のみを排除した全項目を取得する方法
その他(プログラミング・Web制作)
-
15
SELECTで1件のみ取得するには?
Oracle
-
16
単一グループのグループ関数ではありません。
Oracle
-
17
CSVファイルの中で、「 , 」カンマを使いたい
その他(コンピューター・テクノロジー)
-
18
order by区の記述位置
Oracle
-
19
外部結合とor条件混在の記述方法
Oracle
-
20
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
単一グループのグループ関数で...
-
where句中のtrim関数について
-
group byの並び順を変えるだけ...
-
データ
-
updateで複数行更新したい
-
トランザクションログを出力せ...
-
AccessのSQL文で1件のみヒット...
-
【PL/SQL】FROM区に変数を使う方法
-
トリガからプロシージャのコー...
-
Oracle9iデータベースの削除に...
-
SQL*Loader Append
-
「数字で始まらない」ものを抽...
-
ACCESS レコードの並び順について
-
デフォルトでデータが表示され...
-
引数によってwhere句を切り替え...
-
このようなDELETEはできますか?
-
ACCESS2007のエクスポート上限
-
列1と列2の関係性で列3の条...
-
phpmyadminでワイルドカードを...
-
大量レコードをTRUNCATEせずに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【PL/SQL】FROM区に変数を使う方法
-
where句中のtrim関数について
-
単一グループのグループ関数で...
-
SELECT FOR UPDATE で該当レコ...
-
AccessのSQL文で1件のみヒット...
-
group byの並び順を変えるだけ...
-
SQL*Loader Append
-
トランザクションログを出力せ...
-
引数によってwhere句を切り替え...
-
データ
-
アクセスのレポートでレコード...
-
osqleditについて
-
「数字で始まらない」ものを抽...
-
SQLで条件にヒットしたレコード...
-
1レコード全てを改行なしで表...
-
BLOB型項目をSQLの検索条件に指...
-
PL/SQL内の共通関数の引数にフ...
-
updateで複数行更新したい
-
デフォルトでデータが表示され...
-
【SQL】違うフィールド同士の集...
おすすめ情報