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