Sql oracle将两列不同值组合为多列

Sql oracle将两列不同值组合为多列,sql,oracle,solr,Sql,Oracle,Solr,我与Solr合作,每个产品只允许一行。要求是我的网站支持多种市场和每个市场的多种货币,从而导致产品价格。下图 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-

我与Solr合作,每个产品只允许一行。要求是我的网站支持多种市场和每个市场的多种货币,从而导致产品价格。下图

  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
我在这里看到了使用pivot的建议,但这并不能解释答案

编辑:市场和货币是动态值,应该在最终结果中形成不同的列

对于定义的可能对组,您可以构建如下查询

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_产品

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_产品代码:

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;

确实,Solr中不能有由多个字段组成的唯一标识符。然而。在Oracle中,您可以这样做(我假设
productId
+
marketId
+
currencyId
是唯一的):


这样做的好处是使范围查询在市场上更容易(当然,它们在货币上可能没有用处),手动透视或甚至不使用
pivot
功能时,它也是动态的。

P2和P3与所示输出中的标准透视不同。是的,Lalit你是对的,我编辑了问题你不需要
否则为空
。。。这是默认值。其他方面做得很好。感谢您的回复。这看起来可以接受,正如您所说的固定值。但市场和货币都是动态的。动态值需要一个表,您可以在其中保存这些值,然后查询这些值。如果您事先不知道动态数据的值,您还会如何处理这些数据?@Art-我刚刚在答案的第二部分添加了我对动态解决方案的想法。@Pounder Stibbons:是的,这很有效,我希望我能投票给您两次。在这种情况下,表或视图都起作用,应该使用。
SELECT productId || '-' || marketId || '-' || currencyId AS unique_id
     , productId, marketId, currencyId, price
  FROM mytable;