查询以在单个表上乘以某些行集

时间:2013-01-19 14:21:13

标签: sql oracle oracle11g

我有一个复杂的查询,我正在努力。您会注意到架构不是最容易使用的,但它是我给予的,没有时间重新设计(常见故事!)。

我有类似下面的行。注意: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它们告诉我们 if 我们想要倍增以及我们不关心的{{1}}因此我们不希望查询结果中的行。

我们可以在Oracle中这样做吗?最好是一个查询..我猜你需要使用乘法运算符(不知何故)和分组。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;