公司进来效益不太好,我们原来的部门也重组到了新的部门里
部长也转去做销售了,我们都不知道该何去何从了
据说下月就有新项目开始做了,可我担心的是目前做的东西对以后是否有发展前途的问题。
这几天新部门的部长发了封Mail,列出了11条要求,说必须要达到7条以上
才能跟Y的谈加薪和升职问题
来了个下马威啊
郁闷啊
记录学习
我住的地方后面是一条河,还有日剧里常出现的河堤和绿地
春天的时候,小风嗖嗖的吹着,那个凉爽啊
穿过一个天桥,桥下有一条铁轨,尽头是好多待检修的地铁列车
这边是一群印度人在打板球,看了半天,跟棒球也差不多
桥的另一边,是三三两两的家庭或朋友在烧烤聚餐
孩子们在草地上奔跑,追逐嬉戏,后面的母亲追着喊着不要跑,小心
男人们则哈哈大笑地说着什么有趣的事情,然后一起干杯
我穿过聚餐草地,左边是一条穿过江户川河的大桥,每隔2,3分钟便有一辆地铁经过,和大桥一起发出有节奏的共鸣,当繁忙的列车经过的时候,仿佛自己的一切烦恼和忧愁都随着列车一起远去了。
我坐在桥下,一边看着钓鱼的小孩,小孩的父亲正耐心的教他怎样穿鱼饵,怎样钓鱼,还有一边坐着的面带微笑的孩子母亲,我都能感觉到他们一家的幸福。
沿着堤岸往前走,身边跑过一个带着耳机一边享受音乐一边慢跑的青年。前面是几个家庭主妇,牵着宠物犬在散步,又说有笑地谈着家庭琐事。
堤岸旁边有一个棒球场,那里有高声喊叫的教练,还有努力朝着N垒奔跑的小学生,目标就在前面!
罗哩罗嗦写了一堆哈哈
早上上了车就有坐儿,嘿嘿,真开心![]()
拿出我的NDS开始玩动物之森,和小动物交朋友,钓鱼,抓飞虫,种树,挖化石……
突然闻到一股脚臭味儿,那个浓烈啊,坐在我旁边的人不知道是睡着了,还是臭得抽过去了,反正闭着眼一动不动了……
我抬头一看,一个挺正经的小伙呀,怎么衣服上一股的脚臭味儿啊?
再一想,我明白了,估计昨儿晚上臭袜子扔在了衣服上面了!……还浑然不知呢~~闻自己的脚味儿果然不臭啊嘿嘿
就这点困难是吓不倒我这样的四好青年的,终于坚持到了张杨路,
车门刚打开,啊~~,我深深地吸了一口气,啊~~早晨的空气真新鲜啊,世界是这么美好啊
……
�rz
昨天做的一个梦蛮搞笑的
记得好像自己辞职了
有个人叫我跟他比试用棒球棍击打一个球的远近
距离真的超远,这个人用棍子打出去之后连忙往我这边奔过来
问"过来了吗?过来了吗?"
只见球真的飞过来了,哇~~~好厉害!
轮到我了,我走了好远好远的路,终于到了刚才那个人击打球的位置
可是还没等到我打球的时候,一伙人冲过来了,说这个地方很可疑,有些东西看起来很奇怪
然后我就跟着他们一起调查这个地方
后来我竟然加入他们的行列
他们这帮人算是一个公司性质的组织,总是在各地跑来跑去的帮别人维护系统
然后就乘上一家飞机,看见陆地的时候,慢慢开始着陆了,越来越低,越来越低
前面有一个小山头,上面有个老头,飞机翅膀正好飞过他身边,他还摸了摸飞机
飞机竟然在一条公路上着陆了!滑行到一个分叉路口的时候没路了!
忽然飞机往左调了个头,停在了一个小饭馆的门口,门口写着:停机吃饭~
囧rz~~~
后来忘了啊呵呵
不知所梦啊~~~~~
※※※※※※※※※※※※※※※※※※
コ ユウ チン
顧 兪 清
製造ソリューション部
電話:086-021-61001566-861
上海華和得易情報技術発展有限会社
※※※※※※※※※※※※※※※※※※
搞笑
可能这几天总是跟俞佳妮打交道,昨天晚上做梦竟然梦到她了
好像在一个学校里,好像是去上课的样子
还有阮菲菲也出现了
阮菲菲在梦里还对人开玩笑的说是我女朋友了-_-!
可恶啊,人家都已经身怀几甲了,罪过罪过……哦弥陀佛,善哉善哉
呵呵,莫名其妙啊哈哈
1:介绍关于行列转换前的通用知识
Pivot查询是这样的,当你想要取出一些如下的数据时:
C1 C2 C3
������������
a1 b1 x1
a1 b1 x2
a1 b1 x3
想按如下格式显示:
C1 C2 C3(1) C3(2) C3(3)
A1 b1 x1 x2 x3
这样就将行转变成了列。
2:
在我们的日常开发中,经常会遇到这样的情况,就是分类汇总,而用一般的SQL写出的程序,数据是向行的方向展开的,但大部分报表的设计是希望向列的方向展开,这样的话,行列转换是非常必要和有用的!
3:通用转换包的实现
首先看一段代码
这段代码是将部门的收入前3名选择出来并用列的形式显示出来。(关于partiton by ,order by,
row_number over请参考相关分析函数的说明
下边是关于通包的包头说明:
create or replace package r_c_pkg
as
type refcursor is ref cursor; --定义一个结果信类型,用来返回结果集
type array is table of varchar2(30);--定义表结构类型。
procedure dbpivot(p_class_code_array in array ,
p_query in varchar2,
p_row_value in array,
p_class_value in array,
p_sum_row in varchar2,
p_cursor in out refcursor);
end ;
��������������
包体:
create or replace package body r_c_pkg
as
procedure dbpivot(p_class_code_array in array ,--存储类编号的值
p_query in varchar2,--必须有一项为CLASS_code,别名也可以
p_row_value in array,--需要做为列的值
p_class_value in array,--需要根据分类取的值
p_sum_row in varchar2,--如果还要在进行SUM的一些值
p_cursor in out refcursor)
as
------------------------------------------------
/*参数示例
p_class_code=> r_c_pkg.array('001','002','005') -其中001,002为需要分列显示的分类值
p_query =>'select a.pdep_code,c.class_code,sum(a.c_pay) as c_pay,sum(a.base_qty) as b_qty,
row_number()over
(partition by a.pdep_code
order by c.class_code nulls last) seq
from user_charge_tbl a,user_tbl c
where a.pdep_code='18' and a.user_id=c.user_id
group by a.pdep_code,c.class_code
'
p_row_value => r_c_pkg.array('pdep_code') 所有查询最前边那个GROUP BY 对像
p_class_value => r_c_pkg.arry('c_pay','b_qty') 是那个CLASS――CODE后边需要显示的值
p_cursor =>r_c_pkg.refcursor 目的是将得到的结果返回出来
p_sum_row=>'sum(base_cost),sum(f_cost)
*/
-------------------------------------------------
v_ncol_count number;
l_query long ;
v_class LONG;
l_row_value varchar2(500);
v_test_string varchar2(500);
begin
l_query:='select'||' ' ;
for j in 1..p_row_value.count -1
loop
l_row_value:=l_row_value||' '||p_row_value(j)||',';
end loop;
l_query:=l_query||l_row_value ;
--------------mxfhhh20060330
--l_query:=rtrim(l_query,',');
--------------mxfhhh20060330
for i in 1..p_class_code_array.count
loop
for k in 1..p_class_value.count-1
loop
--max(decode(class_code,'005',c_pay,0))f005
v_class:=v_class||' '||'max(decode(class_code,'||p_class_code_array(i)||
','||p_class_value(k)||',0))'||
' f'||p_class_code_array(i)||p_class_value(k)||',';
end loop;
end loop;
l_query:=l_query||v_class;
if p_sum_row='' then
l_query:=rtrim(l_query,',')||' from('||p_query||') group by ';
else
l_query:=l_query||p_sum_row||' from('||p_query||') group by ';
end if;
for j in 1..p_row_value.count
loop
l_query:=l_query||p_row_value(j);
v_test_string :=p_row_value(j)||v_test_string;
end loop;
l_query:=rtrim(l_query,',');
execute immediate 'alter session set cursor_sharing=force';
open p_cursor for l_query;
execute immediate 'alter session set cursor_sharing=exact';
---select user_id into l_query from user_tbl;
end;
end;
整个包的目的是动态生成您需要的行列转换内容,并返回结果集.
动态生成的SQL语句如下所示:
select sarea_code,
max(decode(class_code,004,c_pay,0)) f004c_pay,
max(decode(class_code,004,b_qty,0)) f004b_qty,
max(decode(class_code,005,c_pay,0)) f005c_pay,
max(decode(class_code,005,b_qty,0)) f005b_qty,
max(decode(class_code,006,c_pay,0)) f006c_pay,
max(decode(class_code,006,b_qty,0)) f006b_qty,
max(decode(class_code,007,c_pay,0)) f007c_pay,
max(decode(class_code,007,b_qty,0)) f007b_qty,
max(decode(class_code,008,c_pay,0)) f008c_pay,
max(decode(class_code,008,b_qty,0)) f008b_qty,
sum(base_cost),
sum(f_cost)
from
(
select a.sarea_code,c.class_code,sum(a.c_pay) as c_pay,
sum(a.base_qty+a.closs_qty+a.ex_qty+a.ad_qty) as b_qty,sum(a.base_cost) as base_cost,
sum(a.fadjust_cost) as f_cost,
row_number()over
(partition by a.sarea_code
order by c.class_code nulls last) seq
from user_charge_tbl a,user_tbl c
where a.sarea_code>='18001' and a.sarea_code<='18002' and a.user_id=c.user_id
group by a.sarea_code,c.class_code
)
group by sarea_code
以上程序根据工作需要而完成的,希望对那些报表设计有需要的同行有帮助。
参考书:oracle-one-on-one
--
Guyq <guyq@dealeasy.com>
假如有如下表,其中各个i值对应的行数是不定的
SQL> select * from t;
I A D
---------- ---------- -------------------
1 b 2008-03-27 10:55:42
1 a 2008-03-27 10:55:46
1 d 2008-03-27 10:55:30
2 z 2008-03-27 10:55:55
2 t 2008-03-27 10:55:59
要获得如下结果,注意字符串需要按照D列的时间排序:
1 d,b,a
2 z,t
这是一个比较典型的行列转换,有好几种实现方法
1.自定义函数实现
create or replace function my_concat(n number)
return varchar2
is
type typ_cursor is ref cursor;
v_cursor typ_cursor;
v_temp varchar2(10);
v_result varchar2(4000):= '';
v_sql varchar2(200);
begin
v_sql := 'select a from t where i=' || n ||' order by d';
open v_cursor for v_sql;
loop
fetch v_cursor into v_temp;
exit when v_cursor%notfound;
v_result := v_result ||',' || v_temp;
end loop;
return substr(v_result,2);
end;
SQL> select i,my_concat(i) from t group by i;
I MY_CONCAT(I)
---------- --------------------
1 d,b,a
2 z,t
虽然这种方式可以实现需求,但是如果表t的数据量很大,i的值又很多的情况下,因为针对每个i值都要执行一句select,扫描和排序的次数和i的值成正比,性能会非常差。
2.使用sys_connect_by_path
select i,ltrim(max(sys_connect_by_path(a,',')),',') a
from
(
select i,a,d,min(d) over(partition by i) d_min,
(row_number() over(order by i,d))+(dense_rank() over (order by i)) numid
from t
)
start with d=d_min connect by numid-1=prior numid
group by i;
从执行计划上来看,这种方式只需要扫描两次表,比自定义函数的方法,效率要高很多,尤其是表中数据量较大的时候:
eplan1
3.使用wm_sys.wm_concat
这个函数也可以实现类似的行列转换需求,但是似乎没有办法做到直接根据另外一列排序,所以需要先通过子查询或者临时表排好序
SQL> select i,wmsys.wm_concat(a) from t group by i;
I WMSYS.WM_CONCAT(A)
---------- --------------------
1 b,a,d
2 z,t
SQL> select i,wmsys.wm_concat(a)
2 from
3 (select * from t order by i,d)
4 group by i;
I WMSYS.WM_CONCAT(A)
---------- --------------------
1 d,b,a
2 z,t
执行计划上看,只需要做一次表扫描就可以了,但是这个函数是加密过的,执行计划并不能显示函数内部的操作。
--
Guyq <guyq@dealeasy.com>