1

これを行う方法はあると思いますが、他の多くの人がそうであるように、私はORACLE10gに精通していません。シナリオは次のとおりです。

現在、クラシックASPページをASP.net2.0に変換しています。レポートを作成しているクエリがあります。売上高と以前の売上高を報告しています。現在起こっていることは、1つのクエリがデータベースに送信され、当社の製品を販売している場所の完全なリストを取得することです。次に、場所のすべての行をループし、SQLでいくつかの合計操作を実行します。

他のいくつかのテーブルに送信され、販売数量を合計してから、合計をテーブル行に追加します。ロケーションクエリは多くの結果を返すため、クエリには2〜3分かかります。

私の質問は、これらすべてを1つのクエリに統合するにはどうすればよいかということです。

場所のクエリ:

SELECT DISTINCT t.location, 
  l.city, 
  f.year, 
  f.customer FROM loc t, 
location l, father_table f 
WHERE f.number = t.number(+) 
AND f.code = '0001' 
AND f.c_code = '01' 
AND t.location= l.code(+) 
AND t.code IN ('C', 'S') 
AND t.co_code IN ('G', 'V', 'A', 'D') 
AND t.year = '2008' 
ORDER BY l.city, f.year

上記のクエリの各行の合計クエリは次のとおりです。

SELECT SUM(nvl(t.sale_quantity,0)) sale_quantity 
FROM loc t, father_table f  
WHERE f.number = t.number(+) 
AND f.code = '0001' 
AND f.c_code = '01'
AND f.year = '2008' 
AND t.code = 'C' 
AND t.location = '1566' <----- EACH ROW'S t.location VALUE
AND t.co_code IN ('G', 'V', 'A', 'D') 
GROUP BY t.location, t.code, f.year

元のクエリの各レコードをループする代わりに、クエリを組み合わせて、ロケーションのクエリにSUMを含める方法はありますか。ここで重要なのは、t.code ='C'ではなく'C'&'S'の場合にのみ、2番目のクエリが売上合計を取得することです。

4

1 に答える 1

5

これはあなたが望むことだと思います。正しくない場合は、知っておく必要がある重要な点は CASE 式だと思います。これは、SUM 関数内でフィルタリングする方法です。

SELECT t.location, 
  l.city, 
  f.year, 
  f.customer,
  SUM( NVL( CASE WHEN t.code ='C' THEN t.sale_quantity ELSE 0 END, 0)) sale_quantity
FROM loc t, location l, father_table f 
WHERE f.number = t.number(+) 
AND f.code = '0001' 
AND f.c_code = '01' 
AND t.location= l.code(+) 
AND t.code IN ('C', 'S') 
AND t.co_code IN ('G', 'V', 'A', 'D') 
AND t.year = '2008' 
GROUP BY t.location, l.city, f.year
ORDER BY l.city, f.year
于 2008-11-12T21:15:41.440 に答える