oracle将两列不同的值组合成多列

时间:2015-02-27 09:35:19

标签: sql oracle solr

我正在使用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

我看到过在这里使用数据透视的建议,但无法解释答案。
编辑:市场和货币是动态值,它应该在最终结果中形成不同的列

2 个答案:

答案 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功能的情况下它也是动态的不会。