使用聚合查询

时间:2014-10-01 11:22:16

标签: sql oracle aggregation

我使用的是Oracle SQL,我需要查询帮助。

我有下表(table_A):

Account_ID (int)
Product_Name (varchar) 
A_Value (int)

有7种类型的产品,我不应该事先知道他们的名字。 Account_ID可以有多个产品,同一帐户的产品可以超过1次。

我有另一张桌子(table_B):

Account_ID (int)
B_Value (int)

我需要使用以下输出编写查询:A_Value的每种类型Product_Name的总和除以B_Value

例如

table_A

Account_ID | Product_Name | A_Value
   111     |     A        |   5
   111     |     B        |   8
   111     |     D        |   2
   222     |     A        |   3
   222     |     A        |   10
   333     |     E        |   5
   333     |     E        |   8
   333     |     A        |   1
例如

table_B

Account_ID |   Value_B
     111   |    3
     222   |    2
     333   |    1

输出:

Account_ID |  Product_A       |  Product_B    |  Product_C |  Product_D    |  Product_E     | Product_F
   111     |    5/3 = 1.66    |    8/3 = 2.66 |    null    |   2/3 = 0.66  |    null        |   null
   222     |   (3+10)/2 = 6.5 |   null        |    null    |   null        |    null        |   null
   333     |   1/1=1          |   null        |    null    |   null        |  (8+5)/1 = 13  |    null

有人知道怎么做吗?我可以进行计算,但我不知道如何按产品分列。可能我不得不以另一种方式做,但我不知道如何。

2 个答案:

答案 0 :(得分:2)

您可以通过枢轴,然后加入来获取它:

select b.account_id,
       product_a / b.value_b product_a,
       product_b / b.value_b product_b,
       product_c / b.value_b product_c,
       product_d / b.value_b product_d,
       product_e / b.value_b product_e,
       product_f / b.value_b product_f
from
(
  select *
  from
  (
    select *
    from table_a a
  )
  pivot (sum(a_value) for product_name in ('A' as product_a, 'B' as product_b, 'C' as product_c, 'D' as product_d, 'E' as product_e, 'F' as product_f))
) x, table_b b
where x.account_id = b.account_id
order by 1
;

这给出了:

ACCOUNT_ID  PRODUCT_A   PRODUCT_B   PRODUCT_C   PRODUCT_D   PRODUCT_E   PRODUCT_F
    111         1,666...    2,666...    null        0,666...    null        null        
    222         6,5         null        null        null        null        null
    333         1           null        null        null        13          null

答案 1 :(得分:1)

您可以使用条件聚合执行此操作:

select a.account_id,
       sum(case when product_name = 'A' then a_value end) / max(value_b) as product_A,
       sum(case when product_name = 'B' then a_value end) / max(value_b) as product_B,
       . . .
       sum(case when product_name = 'F' then a_value end) / max(value_b) as product_F,
from table_a a join
     table_b b
     on a.account_id = b.account_id
group by a.account_id;