oracle纵向显示变为横向显示,该如何处理
oracle纵向显示变为横向显示
我有一个表纵向显示大致如下:
商品编码 门店 销量
------------------------
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
...
由于本人刚接触oracle,仅处于一知半解的状态。仅会门店是固定的写法,
但如果门店不是固定的,就不知如何下手了,也曾搜索过一些类似的帖子,但都不是看得很明白,
特来此开帖,望各位大虾不吝赐教。
------解决方案--------------------
一SQL暂时无解,求大神
------解决方案--------------------
动态构造,这个很容易懂吧
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;
------解决方案--------------------
建议楼主查查case when 语句,这是典型的行列转换。
------解决方案--------------------
干嘛字段名字要中文?怪不得没多少人回答呢,下次注意哦,亲
你试试这个语句:
select 商品编号,
max(decode(门店,a,销量)) 门店a,
max(decode(门店,b,销量)) 门店b,
max(decode(门店,c,销量)) 门店c
from 表
group by 商品编号;
------解决方案--------------------
赞个
------解决方案--------------------
行转列什么的,应该可以实现
------解决方案--------------------
我有一个表纵向显示大致如下:
商品编码 门店 销量
------------------------
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
...
由于本人刚接触oracle,仅处于一知半解的状态。仅会门店是固定的写法,
但如果门店不是固定的,就不知如何下手了,也曾搜索过一些类似的帖子,但都不是看得很明白,
特来此开帖,望各位大虾不吝赐教。
------解决方案--------------------
一SQL暂时无解,求大神
------解决方案--------------------
动态构造,这个很容易懂吧
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;
------解决方案--------------------
建议楼主查查case when 语句,这是典型的行列转换。
------解决方案--------------------
干嘛字段名字要中文?怪不得没多少人回答呢,下次注意哦,亲
你试试这个语句:
select 商品编号,
max(decode(门店,a,销量)) 门店a,
max(decode(门店,b,销量)) 门店b,
max(decode(门店,c,销量)) 门店c
from 表
group by 商品编号;
------解决方案--------------------
赞个
------解决方案--------------------
行转列什么的,应该可以实现
------解决方案--------------------
--在代码里面拼接 也很方便的
--先查询SELECT DISTINCT 门店 FROM TB T ORDER BY 门店;返回所有的门店的集合ds
--然后拼接sql 和存储过程思路一样
string sql = "SELECT 商品编码";
for(int i = 0;i <= ds.table[0].rows.count;i++)
{
sql += ",SUM(DECODE(门店,'"+ds.table[0].rows[i][0]+"',1,0)) \"门店"+ds.table[0].rows[i][0]+"\"";
}
sql += "FROM TB GROUP BY 商品编码";