Oracle SQL 交叉表查询
Oracle SQL Cross Tab Query
我有一个 table,它具有以下结构和示例数据:
ITEM LOC STOCK
0001 KS5 10
0001 KS6 30
0002 KS5 10
0002 KS6 20
我需要查询交叉表以便得到
ITEM KS5 KS6
0001 10 30
0002 10 20
LOC(KS5 和 KS6)可能会有所不同,并且可以添加新的位置。
怎样才能得到想要的结果?
请尝试这个查询。
SELECT *
FROM (SELECT ITEM ,LOC ,STOCK
FROM TABLE_NAME)
PIVOT (SUM(quantity) AS sum_quantity FOR (ITEM) IN ('KS5' , 'KS6'))
ORDER BY ITEM;
此致。
对于动态生成的结果,您需要一些动态 PLSQL 解决方案,例如创建视图的过程 v_list_loc
:
create or replace procedure p_list_loc is
v_sql varchar2(32000) := '';
begin
for c in (select distinct loc from test order by loc) loop
v_sql := v_sql || '''' ||c.loc|| ''' '||c.loc||',';
end loop;
v_sql := 'create or replace view v_list_loc as '
||'select * from (select item, loc, stock from test) pivot (sum(stock) '
||'for (loc) in ('||rtrim(v_sql, ',')||'))';
execute immediate v_sql;
end p_list_loc;
在程序代码中将 test
替换为您的 table 名称。编译此过程,运行 和 select 结果来自生成的视图 v_list_loc
:
SQL> exec p_list_loc;
PL/SQL procedure successfully completed
SQL> select * from v_list_loc;
ITEM KS5 KS6
----- ---------- ----------
0001 10 30
0002 10 20
每当 loc
列中出现新值时,您需要在 select 从视图中查看之前执行过程。
尝试修改 SQL 如下:
SELECT *
FROM (SELECT ITEM ,LOC ,STOCK
FROM TABLE_NAME)
PIVOT (SUM(quantity) AS sum_quantity FOR (ITEM) IN (SELECT DISNTINCT(LOC) FROM TABLE_NAME))
ORDER BY ITEM;
我有一个 table,它具有以下结构和示例数据:
ITEM LOC STOCK
0001 KS5 10
0001 KS6 30
0002 KS5 10
0002 KS6 20
我需要查询交叉表以便得到
ITEM KS5 KS6
0001 10 30
0002 10 20
LOC(KS5 和 KS6)可能会有所不同,并且可以添加新的位置。
怎样才能得到想要的结果?
请尝试这个查询。
SELECT *
FROM (SELECT ITEM ,LOC ,STOCK
FROM TABLE_NAME)
PIVOT (SUM(quantity) AS sum_quantity FOR (ITEM) IN ('KS5' , 'KS6'))
ORDER BY ITEM;
此致。
对于动态生成的结果,您需要一些动态 PLSQL 解决方案,例如创建视图的过程 v_list_loc
:
create or replace procedure p_list_loc is
v_sql varchar2(32000) := '';
begin
for c in (select distinct loc from test order by loc) loop
v_sql := v_sql || '''' ||c.loc|| ''' '||c.loc||',';
end loop;
v_sql := 'create or replace view v_list_loc as '
||'select * from (select item, loc, stock from test) pivot (sum(stock) '
||'for (loc) in ('||rtrim(v_sql, ',')||'))';
execute immediate v_sql;
end p_list_loc;
在程序代码中将 test
替换为您的 table 名称。编译此过程,运行 和 select 结果来自生成的视图 v_list_loc
:
SQL> exec p_list_loc;
PL/SQL procedure successfully completed
SQL> select * from v_list_loc;
ITEM KS5 KS6
----- ---------- ----------
0001 10 30
0002 10 20
每当 loc
列中出现新值时,您需要在 select 从视图中查看之前执行过程。
尝试修改 SQL 如下:
SELECT *
FROM (SELECT ITEM ,LOC ,STOCK
FROM TABLE_NAME)
PIVOT (SUM(quantity) AS sum_quantity FOR (ITEM) IN (SELECT DISNTINCT(LOC) FROM TABLE_NAME))
ORDER BY ITEM;