重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
with t(cate_displayname,info_waritername,count) as (
创新互联公司从2013年开始,先为东营区等服务建站,东营区等地企业,进行企业商务咨询服务。为东营区企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
select '2014年','lizifeng',1 from dual
union all
select '历史沿革','wenqingwen',20 from dual
union all
select '领导讲话','lizifeng',3 from dual
)
SELECT cate_displayname,
nvl(lizifeng,0) as lizifeng,
nvl(wenqingwen,0) as wenqingwen
FROM t
PIVOT (
sum(count) ---- pivot_clause
FOR info_waritername ---- pivot_for_clause
IN ('lizifeng' as lizifeng,'wenqingwen' as wenqingwen) ---- pivot_in_clause
);
输出:
CATE_DISPLAYNAME LIZIFENG WENQINGWEN
------------------------ ---------- ----------
2014年 1 0
历史沿革 0 20
领导讲话 3 0
楼主这种
典型的行列转换问题。
Oracle
一般就通过
DECODE
或者
CASE
WHEN
来处理。
SQL
CREATE
TABLE
TEST_YLX
(
2
name
VARCHAR2(2),
3
zfname
VARCHAR2(6),
4
tdate
DATE
5
);
Table
created.
SQL
SQL
INSERT
INTO
TEST_YLX
VALUES
('A',
'size1',
TO_DATE('2010-02-01',
'YYYY-MM-D
D')
);
1
row
created.
SQL
INSERT
INTO
TEST_YLX
VALUES
('A',
'size2',
TO_DATE('2010-02-01',
'YYYY-MM-D
D')
);
1
row
created.
SQL
INSERT
INTO
TEST_YLX
VALUES
('B',
'size1',
TO_DATE('2010-02-01',
'YYYY-MM-D
D')
);
1
row
created.
SQL
INSERT
INTO
TEST_YLX
VALUES
('C',
'size3',
TO_DATE('2010-02-01',
'YYYY-MM-D
D')
);
1
row
created.
SQL
SQL
SELECT
2
name,
3
SUM
(
DECODE(zfname,
'size1',
1,
0)
)
AS
size1,
4
SUM
(
DECODE(zfname,
'size2',
1,
0)
)
AS
size2,
5
SUM
(
CASE
WHEN(zfname
=
'size3')
THEN
1
6
ELSE
7
END
8
)
AS
size3
9
FROM
10
test_ylx
11
GROUP
BY
12
name;
NAME
SIZE1
SIZE2
SIZE3
----
----------
----------
----------
A
1
1
B
1
C
1
SQL
上面的例子中,
size1
和
size2
是用
DECODE
size3
用
CASE
WHEN
看具体情况需要,而使用。
========================================
唯一麻烦的是
这个SQL,
需要预先知道,
size1
size2
size3
这些信息
如果表中新增加了
size4
,
需要修改
SQL
语句。
可用union all来实现。
如test表中数据如下:
现要将id为3的一条按列显示,可用如下语句:
select to_char(id) str from test where id=3
union all
select name from test where id=3;
查询结果:
WITH A AS(SELECT ID_F,LINE_F,STAGE_F,UNITSTAGE_F,CAST(CHILDSTAGE_F AS VARCHAR(100)) AS CHILDSTAGE_F,PARENTID_F FROM 表名 WHERE PARENTID_F IS NULL
UNION ALL
SELECT 表名.ID_F,表名.LINE_F,表名.STAGE_F,表名.UNITSTAGE_F,CAST(A.CHILDSTAGE_F+表名.CHILDSTAGE_F AS VARCHAR(100)) AS CHILDSTAGE_F,表名.PARENTID_F
FROM 表名 JOIN A ON 表名.PARENTID_F=A.ID_F)
SELECT LINE_F,STAGE_F,UNITSTAGE_F,CHILDSTAGE_F
FROM A
WHERE PARENTID_F IS NOT NULL
如果你要做转换查询,真心劝你不要这么干,我的写法很麻烦,一张表不停的查询,逻辑读肯定搞得要死。
如果是往下面这张表灌数,那么可以写循环,慢慢来一行对应一列,可以根据表的列和数据的对应关系往里面灌,这个相对简单些。
我的写法大概是子查询+union all 上面为a表
那么就写为select ‘第一季度' 销售额,(select 第一季度销售额 from a where 产品名称='奶酪')奶酪,(select 第一季度销售额 from a where 产品名称='啤酒') from dual
union all
还像上面那么写,写第二季度
union all
第三季度
union all
第四季度
一张表重读查询8次,如果表很大,我估计机器会宕掉的。
因为单独从一列来看也可以理解为列转行,所以用case when写也可以,这么写似乎读取的次数会少些,不过要用到group by分组,天知道二者最后谁的消耗大。不过如果表很大的话,还是那句话,建议新建表然后灌数,这么直接查,真的会死掉的。
以上为个人建议,如果找到什么好写法,也可以研究下。