1

私は苦労している少し複雑なクエリを持っています。スキーマを操作するのが最も簡単ではないことに気付くでしょうが、それは私が与えられたものであり、再設計する時間はありません (よくある話!)。

以下のような行があります。注: 3 桁のvalue数字は、私が作成した乱数です。

id     field_id     value
1      5            999 
1      6            888
1      7            777
1      8            foo <--- foo so we want the 3 values above
1      9            don't care

2      5            123 
2      6            456
2      7            789
2      8            bar <--- bar so we DON'T want the 3 values above
2      9            don't care

3      5            623 
3      6            971
3      7            481
3      8            foo <--- foo so we want the 3 values above
3      9            don't care

...
...

n      5            987 
n      6            654
n      7            321
n      8            foo <--- foo so we want the 3 values above
n      9            don't care

この結果が欲しい:

id     result
1      999*888*777
3      623*971*481
...
n      987*654*321

これは明らかですか?したがって、行を持つテーブルがありn*5ます。行のセットのそれぞれについて5:3それらの行には一緒に乗算したい値があり、それらの行は乗算する1どうかを示し1、それらの行は気にしないため、クエリ結果に行が含まれないようにします。

Oracleでこれを行うことはできますか? できれば1つのクエリ..乗算演算子(どういうわけか)とグループ化を使用する必要があると思います。

どんな助けでも素晴らしいでしょう。ありがとうございました。

4

2 に答える 2

2

このようなもの:

select m.id, exp(sum(ln(m.value)))
  from mytab m
 where m.field_id in (5, 6, 7)
   and m.id in (select m2.id
                  from mytab m2
                 where m2.field_id = 8
                   and m2.value = 'foo')
 group by m.id;

例えば:

SQL> select * from mytab;

        ID   FIELD_ID VAL
---------- ---------- ---
         1          5 999
         1          6 888
         1          7 777
         1          8 foo
         1          9 x
         2          5 123
         2          6 456
         2          7 789
         2          8 bar
         2          9 x
         3          5 623
         3          6 971
         3          7 481
         3          8 foo
         3          9 x

15 rows selected.

SQL> select m.id, exp(sum(ln(m.value))) result
  2    from mytab m
  3   where m.field_id in (5, 6, 7)
  4     and m.id in (select m2.id
  5                    from mytab m2
  6                   where m2.field_id = 8
  7                     and m2.value = 'foo')
  8   group by m.id;

        ID     RESULT
---------- ----------
         1  689286024
         3  290972773
于 2013-01-19T14:57:45.990 に答える
0

同じロジック。ハードコードされた値を削除しただけです。この回答を投稿することは、他の人にとって役立つかもしれません。

    SELECT a.id,
           exp(sum(ln(a.val)))
    FROM mytab a,
      (SELECT DISTINCT id,
                       field_id
       FROM mytab
       WHERE val = 'foo') b
    WHERE a.id = b.id
      AND a.field_id < b.field_id
    GROUP BY a.id;
于 2013-01-21T13:44:38.257 に答える