我使用的是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
有人知道怎么做吗?我可以进行计算,但我不知道如何按产品分列。可能我不得不以另一种方式做,但我不知道如何。
答案 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;