重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
如果“站名”、“条码”、“时间”都是一样的话,可以这么写:
我们提供的服务有:成都网站设计、成都做网站、微信公众号开发、网站优化、网站认证、浮山ssl等。为上千多家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的浮山网站制作公司
with
t_temp as (select row_number() over (partition by station_name order by param_name asc) id, t.* from t),
t_temp1 as (select * from t_temp where id = 1),
t_temp2 as (select * from t_temp where id = 2),
t_temp3 as (select * from t_temp where id = 3)
select '站名' col1, '条码' col2, t_temp1.参数名 col3, t_temp2.参数名 col4, t_temp3.参数名 col5, '时间' col6
from t_temp1, t_temp2, t_temp3
where t_temp1.站名 = t_temp2.站名
and t_temp2.站名 = t_temp3.站名
union all
select t_temp1.站名, t_temp1.条码, to_char(t_temp1.数值), to_char(t_temp2.数值), to_char(t_temp3.数值), to_char(t_temp1.时间)
from t_temp1, t_temp2, t_temp3
where t_temp1.站名 = t_temp2.站名
and t_temp2.站名 = t_temp3.站名
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
测试表测了下,可以用,你看看,主要是先根据逗号进行分割,然后connect,level等于逗号的数目:
select id,nvl(substr(glbh,instr(glbh,',',1,lvl)+1,instr(glbh,',',1,lvl+1)-instr(glbh,',',1,lvl)-1),'kong') glbh
from (
select id,lvl,','||glbh||',' glbh
from test a ,
(select level lvl from dual connect by level=
(select max(length(glbh)-length(replace(glbh,',')))+1 from test)) b
) t1
where substr(glbh,instr(glbh,',',1,lvl)+1,instr(glbh,',',1,lvl+1)-instr(glbh,',',1,lvl)-1) is not null
order by id,glbh;
创建表插入数据:
create table test
(id int,
field int);
insert into test values (1,101);
insert into test values (1,102);
insert into test values (1,103);
insert into test values (2,36);
insert into test values (2,37);
insert into test values (2,38);
insert into test values (2,39);
commit;
执行:
select t.id,
max(decode(rn, 1, field, null)) field1,
max(decode(rn, 2, field, null)) field2,
max(decode(rn, 3, field, null)) field3,
max(decode(rn, 4, field, null)) field4,
max(decode(rn, 5, field, null)) field5
from (select test.*, row_number() over(partition by id order by field) rn
from test) t
group by t.id;
结果:
你把屏幕旋转90°,或者你把脑袋横着屏幕也可以。
不仅仅是 Oracle ,就目前人类已经创造的数据库而言,在显示习惯上,不管是屏幕还是纸质,横向显示列(Col),纵向显示行(Row),因为表的数据增减是沿着行(Row)的方向增减,而人们更习惯于纵向快速对比同一列的多行信息,而不善于横向对比同一行的多列信息。
大概可以猜到你希望构建一个数据结果视图,这个视图的列值是指定的某个月的全部日期,如果在最左边再加上几列,比如序号、名次、姓名,最右边再加上一列,比如总业绩,那么就可以用来展示该月全体销售人员的销售额以及排名。如果要实现类似需求,那么就努力构造你的 SQL 语句吧,虽然没有证据证明无法用 SELECT 语句实现,但似乎SELECT 必须制定列名,即使你使用 * 那也代表的是所有列。如果配合程序语言,那么实现起来就很简单。你可以试试存储过程,动态创建表,直接构造你需要的列,然后 SELECT * 即可。
上个世纪出现计算机屏幕的时候,屏幕显示就是纵向滚屏,横向从来没动过,至今人们已经习惯了屏幕纵向滚动,因为大多数语言文字都是横向排版比较适合人们的阅读习惯,纵向阅读确实费劲。如果最初屏幕是横向滚动的,那么现在情况也许就截然不同了。
顺便说一下,阅读横向排版的纸质或电子版的中文书籍,页面较宽而字符较小行距较小的时候,容易找错下一行。阅读英文则很少有此情况,这也许是方块字与长短英文单词的区别?阅读台湾出版的纵向排版的中文书籍,刚开始不习惯,后来觉得确实比横向排版有优势。比如,你单手把书翻卷起来,阅读到接近中缝的文本时,不需要反复以书脊为轴转动书本,阅读很方便。而如果是横排,那么你看到接近中缝的几个字之后,需要转动书本再去找举例中缝最远的下一行,很容易就找错了。也许,如果计算机最初是台湾人发明的,那么现在鼠标中间那个滚轮就应该是横着的,电脑屏幕也是横向滚动,而纵向基本不动了。看看下面这段纵向文字,舒服不?
行转列的准则就是通过主键进行分组,之后对行其它字段加上sum()、max()、count()函数,里边用decode()这类函数进行处理,总之分组不要用到他就成。