参考 oracle11g行变列两种办法的比较:
站在用户的角度思考问题,与客户深入沟通,找到科尔沁右翼前网站设计与科尔沁右翼前网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站制作、成都网站建设、外贸营销网站建设、企业官网、英文网站、手机端网站、网站推广、空间域名、网络空间、企业邮箱。业务覆盖科尔沁右翼前地区。
方法1:优点是分析函数,缺点:返回log,低效,
select link_pid, replace(strs,',','|') all_forms
from
(select t.link_pid,
wmsys.wm_concat(t.form_of_way)
over(partition by t.link_pid order by t.form_of_way ) strs,
row_number() over(partition by t.link_pid order by t.form_of_way) RN,
count(1) over(partition by t.link_pid ) CNT
from rd_link_form t
) where RN=CNT
方法2:优点是高效,返回char,缺点:不是分析函数
select t.link_pid,
listagg(t.form_of_way, '|')
within group (order by t.form_of_way ) all_forms
from rd_link_form t
group by t.link_pid
listagg()需在11.2版本下才行
两种方法的比较:依link_pid去重后有23万的数据量,方法1的wmsys.wm_concat用3小时看不到结果,方法2的listagg用80秒看到结果
【我以字典表user_tab_columns改写了上述SQL,如下,大家直接执行就行:】
方法1:
select table_name, replace(strs, ',', '|') all_forms
from (select t.table_name,
wmsys.wm_concat(t.COLUMN_NAME) over(partition by t.table_name order by t.COLUMN_NAME) strs,
row_number() over(partition by t.table_name order by t.COLUMN_NAME) RN,
count(1) over(partition by t.table_name) CNT
from user_tab_columns t)
where RN = CNT
方法2:
select t.table_name,
listagg(t.COLUMN_NAME, '|')
within group (order by t.COLUMN_NAME ) all_forms
from user_tab_columns t
group by t.table_name
大家可以直接在自己的pl/sql中运行上述SQL
当月数据
select * from table t
where t.create_time
=TRUNC(SYSDATE, 'MM')
and
t.create_time=last_day(SYSDATE) create_time为你要查询的时间
当年数据
select * from table t
where t.create_time
=trunc(sysdate,'YYYY')
and
t.create_time=add_months(trunc(sysdate,'YYYY'),12)-1
本周(国外周日为一个星期第一天)
where t.create_time =trunc(sysdate,'day')+1 and
t.create_time=trunc(sysdate,'day')+6 本周(国内周一为一个星期第一天)
where t.create_time =trunc(next_day(sysdate-8,1)+1) and
t.create_time=trunc(next_day(sysdate-8,1)+7)+1
有几周,把每个月的最后一天拼成串传到如下SQL:
select to_char(to_date('20111031','yyyymmdd'),'w') from dual;
每周日期段没找到直接的,可以自己写个函数:
1、获取1号是周几,如周4;
2、则1-4号为第一周,即1号+(7-4)天=4号;
3、循环:4+1=5号——4+7=11号为第二周;
直到:某周加完后的日期,大于该月的最大天数,则取该月最大天数收尾,循环结束;
第二种方法是你建个存日期的表:
date week
……
20110101
20110102
……
里面存N年的日期,然后根据
select to_char(to_date('20111031','yyyymmdd'),'w') from dual; 把week字段update进去;
然后直接根据这张表写SQL就直接获取几周,每周是几号到几号了。。。
--1、取某天在本周中的第几天(默认周日开始算第1天)
select to_char(to_date('2011-04-11','yyyy-mm-dd'), 'd') from dual;
--2、如果要从周一开始算第1天,需要做一些手脚
--大概思路是:1变成7,2变成1,3变成2......,7变成6
select decode(to_char(to_date('2011-04-04', 'yyyy-mm-dd'), 'd'),
1,
7,
to_char(to_date('2011-04-04', 'yyyy-mm-dd'), 'd') - 1)
from dual;
--3、再根据上面的结论倒推到上周时间
select to_date('2011-04-04', 'yyyy-mm-dd') -
decode(to_char(to_date('2011-04-04', 'yyyy-mm-dd'), 'd'),
1,
7,
to_char(to_date('2011-04-04', 'yyyy-mm-dd'), 'd') - 1) - 7 + 1,
to_date('2011-04-04', 'yyyy-mm-dd') -
decode(to_char(to_date('2011-04-04', 'yyyy-mm-dd'), 'd'),
1,
7,
to_char(to_date('2011-04-04', 'yyyy-mm-dd'), 'd') - 1) - 7 + 1 + 6
from dual;