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 中做到这一点吗?最好是一个查询。我猜你需要使用乘法运算符(不知何故)和分组。

任何帮助都会很棒。谢谢你。

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 回答