【解決方法】Oracleのメインクエリに2カウントのサブクエリを追加しようとしてつまづきました


それぞれ異なるカウントを計算する 2 つのサブクエリを含めるように既存のクエリを更新しようとしています。 メイン クエリは単独で正常に実行され、2 つのサブクエリも単独で実行できましたが、それらを結合しようとすると、「キーワードがありません」という構文エラーが発生します。

これが私の主な質問です。 3 つの個別のテーブルから検査データを取得し、検査プログラムが実行されるたびに表示するジョブ番号ごとに要約します。 検査データは、フィーチャ タイプ (穴、Z 軸、またはコーナー) に基づいてさまざまなテーブルに分割されます。 各ジョブ番号の結果は、これら 3 つのテーブルのうちの 1 つだけ、または複数のテーブルで見つけることができます。 このため、メイン クエリに MIN 関数があり、ジョブ番号ごとに 1 つのエントリが作成されることになります。 もう 1 つ注意すべきことは、各テーブルには同じタイプの 1 つ以上のプローブ フィーチャを含めることができ、相違点は異なる場所にあるということです。

SQL

SELECT MIN(t.timeofentry) as timeofentry, t.machine, t.tape, t.partnumber, t.spindle, t.jobnumber 
from (
     SELECT timeofentry, machine, tape, partnumber, spindle, jobnumber
      FROM PROBEVALIDATIONHOLE
      WHERE HOLENUMBER = 1 AND TIMEOFENTRY between '01/01/2024 12:00:00 AM' and '01/12/2024 11:59:59 PM' and Machine = 'NC-537'
      UNION
      SELECT timeofentry, machine, tape, partnumber, spindle, jobnumber
      FROM PROBEVALIDATIONZAXIS
      WHERE ZHIT = 1 AND TIMEOFENTRY between '01/01/2024 12:00:00 AM' and '01/12/2024 11:59:59 PM' and Machine = 'NC-537'
      UNION
      SELECT timeofentry, machine, tape, partnumber, spindle, jobnumber
      FROM PROBEVALIDATIONCORNER
      WHERE TIMEOFENTRY between '01/01/2024 12:00:00 AM' and '01/12/2024 11:59:59 PM' and Machine = 'NC-537'
      )t 
      GROUP BY t.machine, t.tape, t.partnumber, t.spindle, t.jobnumber
      ORDER BY timeofentry

これにより、次のようなデータが返されます。
エントリ時間、マシン、テープ、部品番号、スピンドル、ジョブ番号
01/02/2024 11:13:50 PM、NC-537、4479、ABC、LH、75576
01/02/2024 11:25:50 PM、NC-537、4479、ABC、RH、75577

ここで、クエリに 2 つのカウントを追加して、ジョブ番号に対して検査されたフィーチャの合計数と、そのジョブ番号に対して許容範囲外だったフィーチャの合計数の両方を表示したいと思います。 このようなもの:

エントリ時間、マシン、テープ、部品番号、スピンドル、ジョブ番号、失敗、合計
01/02/2024 11:13:50 PM、NC-537、4479、ABC、LH、75576​​、0、4
01/02/2024 11:25:50 PM、NC-537、4479、ABC、RH、75577、2、4

それぞれのサブクエリを次に示します。 失敗した機能が含まれるジョブでは、すべてのジョブに失敗した機能があるわけではないため、サブクエリが null を返す場合があるため、どこかに COALESCE が必要になると思います。

これには、失敗した機能の数が含まれています。

SQL

select jobnumber, sum(fails)as TotalFails
from(
select jobnumber, count(*) as fails from probevalidationhole where TIMEOFENTRY between '01/01/2024 12:00:00 AM' and '01/12/2024 11:59:59 PM' and Machine = 'NC-537' and (xoutoftol = 'Yes' or youtoftol = 'Yes') group by jobnumber
union
select jobnumber, count(*) as fails from probevalidationzaxis where TIMEOFENTRY between '01/01/2024 12:00:00 AM' and '01/12/2024 11:59:59 PM' and Machine = 'NC-537' and Zoutoftol = 'Yes' group by jobnumber
union
select jobnumber, count(*) as fails from probevalidationcorner where TIMEOFENTRY between '01/01/2024 12:00:00 AM' and '01/12/2024 11:59:59 PM' and Machine = 'NC-537' and (xoutoftol = 'Yes' or youtoftol = 'Yes') group by jobnumber)
group by jobnumber

これには、機能の合計数が含まれます。

SQL

select jobnumber, sum(features)as TotalFeatures
from(
select jobnumber, count(*) as features from probevalidationhole where TIMEOFENTRY between '01/01/2024 12:00:00 AM' and '01/12/2024 11:59:59 PM' and Machine = 'NC-537' group by jobnumber
union
select jobnumber, count(*) as features from probevalidationzaxis where TIMEOFENTRY between '01/01/2024 12:00:00 AM' and '01/12/2024 11:59:59 PM' and Machine = 'NC-537' group by jobnumber
union
select jobnumber, count(*) as features from probevalidationcorner where TIMEOFENTRY between '01/01/2024 12:00:00 AM' and '01/12/2024 11:59:59 PM' and Machine = 'NC-537' group by jobnumber)
group by jobnumber

私が試したこと:

「キーワードがありません」という構文エラーが発生したときに私が試していたことは次のとおりです。 最初に全体的な機能を追加してから、失敗した機能を実行しようとしましたが、全体的な機能だけを機能させることができないようです。

SQL

SELECT MIN(t.timeofentry) as timeofentry, t.machine, t.tape, t.partnumber, t.spindle, t.jobnumber, TF.totalfeatures
from (
     SELECT timeofentry, machine, tape, partnumber, spindle, jobnumber
      FROM PROBEVALIDATIONHOLE
      WHERE HOLENUMBER = 1 AND TIMEOFENTRY between '01/01/2024 12:00:00 AM' and '01/12/2024 11:59:59 PM' and Machine = 'NC-537'
      UNION
      SELECT timeofentry, machine, tape, partnumber, spindle, jobnumber
      FROM PROBEVALIDATIONZAXIS
      WHERE ZHIT = 1 AND TIMEOFENTRY between '01/01/2024 12:00:00 AM' and '01/12/2024 11:59:59 PM' and Machine = 'NC-537'
      UNION
      SELECT timeofentry, machine, tape, partnumber, spindle, jobnumber
      FROM PROBEVALIDATIONCORNER
      WHERE TIMEOFENTRY between '01/01/2024 12:00:00 AM' and '01/12/2024 11:59:59 PM' and Machine = 'NC-537'
      )t
      left join
      (select jobnumber, sum(features)as TotalFeatures
      from(
      select jobnumber, count(*) as features from probevalidationhole where TIMEOFENTRY between '01/01/2024 12:00:00 AM' and '01/12/2024 11:59:59 PM' and Machine = 'NC-537' group by jobnumber
      union
      select jobnumber, count(*) as features from probevalidationzaxis where TIMEOFENTRY between '01/01/2024 12:00:00 AM' and '01/12/2024 11:59:59 PM' and Machine = 'NC-537' group by jobnumber
      union
      select jobnumber, count(*) as features from probevalidationcorner where TIMEOFENTRY between '01/01/2024 12:00:00 AM' and '01/12/2024 11:59:59 PM' and Machine = 'NC-537' group by jobnumber)
      group by jobnumber) as TF
      on t.jobnumber = TF.jobnumber
      GROUP BY t.machine, t.tape, t.partnumber, t.spindle, t.jobnumber, tf.totalfeatures
      ORDER BY timeofentry

解決策 1

私はそれを考え出した。 愚かなタイプミスでした。 下から4行目に「as TF」とありましたが、単に「TF」にするべきでした。

コメント

タイトルとURLをコピーしました