2013-01-19 25 views
0

我有一点复杂的查询,我正在努力。你会注意到模式并不是最简单的工作,但这是我得到的,没有时间重新设计(常见的故事!)。查询将单个表上的某些行集合相乘

我有类似下面的行。注意: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中做到这一点吗?最好是一个查询..我想你需要使用乘法运算符(以某种方式)和一个分组。

任何帮助将是伟大的。谢谢。

+0

只是为了澄清一下。 'value'是一个varchar2字符串。是'foo'总是'field_id' = 8并且乘以的值总是'field_id' 5-7? – DazzaL

+0

@DazzaL:是的,是的,对你的三个问题是肯定的:)。 – ale

回答

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 
+0

完美:)非常感谢你! +1并解决。 – ale

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;