记录学习

2008年12月25日星期四

最近有点迷茫啊

公司进来效益不太好,我们原来的部门也重组到了新的部门里

部长也转去做销售了,我们都不知道该何去何从了

据说下月就有新项目开始做了,可我担心的是目前做的东西对以后是否有发展前途的问题。

这几天新部门的部长发了封Mail,列出了11条要求,说必须要达到7条以上

才能跟Y的谈加薪和升职问题

来了个下马威啊

郁闷啊

 

 

 

 

 

 

 

 

 

 

 

2008年12月18日星期四

在日本那会儿的日子

 

我住的地方后面是一条河,还有日剧里常出现的河堤和绿地
春天的时候,小风嗖嗖的吹着,那个凉爽啊
穿过一个天桥,桥下有一条铁轨,尽头是好多待检修的地铁列车
这边是一群印度人在打板球,看了半天,跟棒球也差不多
桥的另一边,是三三两两的家庭或朋友在烧烤聚餐
孩子们在草地上奔跑,追逐嬉戏,后面的母亲追着喊着不要跑,小心
男人们则哈哈大笑地说着什么有趣的事情,然后一起干杯
我穿过聚餐草地,左边是一条穿过江户川河的大桥,每隔2,3分钟便有一辆地铁经过,和大桥一起发出有节奏的共鸣,当繁忙的列车经过的时候,仿佛自己的一切烦恼和忧愁都随着列车一起远去了。
我坐在桥下,一边看着钓鱼的小孩,小孩的父亲正耐心的教他怎样穿鱼饵,怎样钓鱼,还有一边坐着的面带微笑的孩子母亲,我都能感觉到他们一家的幸福。
沿着堤岸往前走,身边跑过一个带着耳机一边享受音乐一边慢跑的青年。前面是几个家庭主妇,牵着宠物犬在散步,又说有笑地谈着家庭琐事。
堤岸旁边有一个棒球场,那里有高声喊叫的教练,还有努力朝着N垒奔跑的小学生,目标就在前面!
罗哩罗嗦写了一堆哈哈

2008年12月17日星期三

今天坐公交车真是糟了罪了啊

早上上了车就有坐儿,嘿嘿,真开心
拿出我的NDS开始玩动物之森,和小动物交朋友,钓鱼,抓飞虫,种树,挖化石……

突然闻到一股脚臭味儿,那个浓烈啊,坐在我旁边的人不知道是睡着了,还是臭得抽过去了,反正闭着眼一动不动了……
我抬头一看,一个挺正经的小伙呀,怎么衣服上一股的脚臭味儿啊?

再一想,我明白了,估计昨儿晚上臭袜子扔在了衣服上面了!……还浑然不知呢~~闻自己的脚味儿果然不臭啊嘿嘿

就这点困难是吓不倒我这样的四好青年的,终于坚持到了张杨路,
车门刚打开,啊~~,我深深地吸了一口气,啊~~早晨的空气真新鲜啊,世界是这么美好啊

……
�rz

2008年12月16日星期二

昨天做的一个梦的部分记录

昨天做的一个梦蛮搞笑的

记得好像自己辞职了

有个人叫我跟他比试用棒球棍击打一个球的远近

距离真的超远,这个人用棍子打出去之后连忙往我这边奔过来

问"过来了吗?过来了吗?"

只见球真的飞过来了,哇~~~好厉害!

轮到我了,我走了好远好远的路,终于到了刚才那个人击打球的位置

可是还没等到我打球的时候,一伙人冲过来了,说这个地方很可疑,有些东西看起来很奇怪

然后我就跟着他们一起调查这个地方

后来我竟然加入他们的行列

他们这帮人算是一个公司性质的组织,总是在各地跑来跑去的帮别人维护系统

然后就乘上一家飞机,看见陆地的时候,慢慢开始着陆了,越来越低,越来越低

前面有一个小山头,上面有个老头,飞机翅膀正好飞过他身边,他还摸了摸飞机

飞机竟然在一条公路上着陆了!滑行到一个分叉路口的时候没路了!

忽然飞机往左调了个头,停在了一个小饭馆的门口,门口写着:停机吃饭~

囧rz~~~

后来忘了啊呵呵

不知所梦啊~~~~~

 

 

 

 

 

 

※※※※※※※※※※※※※※※※※※

コ  ユウ チン

顧 兪 清

 

製造ソリューション部

メール:guyq@dealeasy.com

電話:086-021-61001566-861

上海華和得易情報技術発展有限会社

www.dealeasy.com

 

※※※※※※※※※※※※※※※※※※

 

2008年11月12日星期三

昨天梦到公司是的MM了

搞笑

可能这几天总是跟俞佳妮打交道,昨天晚上做梦竟然梦到她了

好像在一个学校里,好像是去上课的样子

还有阮菲菲也出现了

阮菲菲在梦里还对人开玩笑的说是我女朋友了-_-!

可恶啊,人家都已经身怀几甲了,罪过罪过……哦弥陀佛,善哉善哉

呵呵,莫名其妙啊哈哈

2008年10月27日星期一

row column changed2

关天ORACLE分析函数和行列转换通用包程序

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请参考相关分析函数的说明

http://www.emagister.cn/cursos-oracle%E7%AC%94%E8%AE%B0-%E5%88%86%E6%9E%90%E5%87%BD%E6%95%B0-simcour-2201109.htm)

下边是关于通包的包头说明:

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>

row column change method

Oracle一个典型行列转换的几种实现方法
作者:NinGoo | 【转载须以超链接形式标明文章原始出处和作者信息】

假如有如下表,其中各个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>