我正在使用Solr,每个产品只允许使用1行。要求是我的网站支持多个市场和每个市场多种货币导致产品价格。如下图
ProductId MarketId CurrencyId Price
P1---M1---C1---100
P1---M1---C2---200
P1---M2---C1---300
P1---M2---C2---400
P2---M3---C3---500
P2---M1---C1---600
所需的输出是
PrId--M1C1--M1C2--M2C1--M2C2--M3C3
P1----100---200---300---400---NULL
P2----600---NULL--NULL--NULL--500
我看到过在这里使用数据透视的建议,但无法解释答案。
编辑:市场和货币是动态值,它应该在最终结果中形成不同的列
答案 0 :(得分:3)
对于已定义的可能对组,您可以构建如下的查询。
select productid pid,
sum (case when marketid='M1' and currencyid='C1' then price else null end) m1c1,
sum (case when marketid='M1' and currencyid='C2' then price else null end) m1c2,
sum (case when marketid='M2' and currencyid='C1' then price else null end) m2c1,
sum (case when marketid='M2' and currencyid='C2' then price else null end) m2c2,
sum (case when marketid='M3' and currencyid='C3' then price else null end) m3c3
from products
group by productid
结果:
PID M1C1 M1C2 M2C1 M2C2 M3C3
---------- ---------- ---------- ---------- ---------- ----------
P1 100 200 300 400
P2 500
P3 600
为了动态制作,我认为你可以创建PLSQL程序。
编辑:“动态”解决方案,其中包含构建视图v_products
的程序:
begin p_products; end;
select * from v_products;
Output:
PID M1_C1 M1_C2 M2_C1 M2_C2 M3_C3
---------- ---------- ---------- ---------- ---------- ----------
P1 100 200 300 400
P2 500
P3 600
程序p_products代码:
create or replace procedure p_products is
v_sql varchar2(4000) :=
'create or replace view v_products as select productid pid, ';
begin
for o in (
select distinct marketid mid, currencyid cid from products
order by marketid, currencyid)
loop
v_sql := v_sql||' sum (case when marketid='''||o.mid
||''' and currencyid='''||o.cid||''' then price else null end) '
||o.mid||'_'||o.cid||', ';
end loop;
v_sql := rtrim(v_sql, ', ');
v_sql := v_sql||' from products group by productid';
execute immediate v_sql;
end;
答案 1 :(得分:1)
在Solr中,您不能拥有由多个字段组成的唯一标识符。但是,you can generate a concatenated key and use that as your unique identifier。在Oracle中,您可以按照以下方式执行此操作(我假设productId
+ marketId
+ currencyId
是唯一的):
SELECT productId || '-' || marketId || '-' || currencyId AS unique_id
, productId, marketId, currencyId, price
FROM mytable;
这样做的好处是可以轻松地在市场上进行范围查询(当然它们可能对货币没有用),并且在手动转动甚至使用PIVOT
功能的情况下它也是动态的不会。