我有一个表纵向显示大致如下:
商品编码 门店 销量
------------------------
001 a 100
001 b 50
002 c 250
002 a 10
003 b 15
...
我现在想把门店(门店数量不是固定的),销量变为横向显示,如下
商品编码 门店a 门店b 门店c ...
--------------------------------------
001 100 50
002 10 250
003 15
方法1:
动态构造,这个很容易懂吧
DECLARE
V_SQL VARCHAR2(2000);
CURSOR CURSOR_1 IS
SELECT DISTINCT 门店 FROM TB T ORDER BY 门店;
BEGIN
V_SQL := 'SELECT 商品编码';
FOR V_XCLCK IN CURSOR_1 LOOP
V_SQL := V_SQL || ',' || 'SUM(DECODE(门店,''' || V_XCLCK.门店 ||
''',销量,0)) AS ' || V_XCLCK.门店;
END LOOP;
V_SQL := V_SQL || ' FROM TB GROUP BY 商品编码';
--DBMS_OUTPUT.PUT_LINE(V_SQL);
V_SQL := 'CREATE OR REPLACE VIEW TB2 AS ' || V_SQL;
--DBMS_OUTPUT.PUT_LINE(V_SQL);
EXECUTE IMMEDIATE V_SQL;
END;
方法2:
select 商品编号,
max(decode(门店,a,销量)) 门店a,
max(decode(门店,b,销量)) 门店b,
max(decode(门店,c,销量)) 门店c
from 表
group by 商品编号;
方法3:
DECLARE
V_SQL VARCHAR2(2000);
CURSOR CURSOR_1 IS
SELECT DISTINCT 门店 FROM TB T ORDER BY 门店;
BEGIN
V_SQL := 'SELECT 商品编码';
FOR V_XCLCK IN CURSOR_1 LOOP
V_SQL := V_SQL || ',' || 'SUM(DECODE(门店,''' || V_XCLCK.门店 ||
''',销量,0)) AS ' || V_XCLCK.门店;
END LOOP;
V_SQL := V_SQL || ' FROM TB GROUP BY 商品编码';
--DBMS_OUTPUT.PUT_LINE(V_SQL);
V_SQL := 'CREATE OR REPLACE VIEW TB2 AS ' || V_SQL;
--DBMS_OUTPUT.PUT_LINE(V_SQL);
EXECUTE IMMEDIATE V_SQL;
END;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23490154/viewspace-1062435/
,如需转载,请注明出处,否则将追究法律责任。