亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 6919 | 回復(fù): 8
打印 上一主題 下一主題

一個(gè)SQL存儲(chǔ)過程 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2005-01-21 21:25 |只看該作者 |倒序?yàn)g覽
在一個(gè)論壇上有人發(fā)個(gè)帖子問這個(gè)問題:

有一表的記錄為:
Task_ID   Employee_Name  STEPWORKTIME
   6262         張三               2
   6262         李四          2
   6262         王二                1.5
   6265         成某               2
   6265         趙某         2
   6265         錢某         1.5
……
我想求一個(gè)函數(shù)能將Task_ID字段相同記錄合并為一條記錄。
即想得到如下結(jié)果:
Task_ID Employees                 WorkLoad
   6262    張三、李四、王二          5.5     
   6265    成某、趙某、錢某          5.5
   ……

我寫了一下,沒寫出UDF,只寫了個(gè)存儲(chǔ)過程。能應(yīng)付他大概的要求。
可是樓主不怎么滿意,想著與其丟掉,不如索性貼出來,大家批評(píng)批評(píng)^_^。

先創(chuàng)建一個(gè)表,名為FromTable
db2 create table FromTable(id varchar(10),name varchar(200),stepworktime int)
插入數(shù)據(jù)
db2 insert into FromTable values ('6262','張三',2)
db2 insert into FromTable values ('6262','李四',2)
db2 insert into FromTable values ('6262','王二',1.5)
db2 insert into FromTable values ('6265','成某',2)
db2 insert into FromTable values ('6265','趙某',2)
db2 insert into FromTable values ('6265','錢某',1.5)

現(xiàn)在再創(chuàng)建一個(gè)表,為ToTable
跟test1000一樣的結(jié)構(gòu),用一個(gè)存儲(chǔ)過程把你要的結(jié)果插進(jìn)去
創(chuàng)表
db2 create  TABLE ToTable ( id  varchar(100), name varchar(100),sum int )

寫存儲(chǔ)過程


CREATE PROCEDURE ADMINISTRATOR.ProcConcatName (  )
------------------------------------------------------------------------
--SQL 存儲(chǔ)過程
--Sisijian
--2005-01-20
------------------------------------------------------------------------

Lable1: begin

------------------------------------------------------------------------
--定義變量
--v_NumOfRecd存放對(duì)應(yīng)FromTable每個(gè)id記錄條數(shù)
--v_Index控制當(dāng)前記錄是在id相同的記錄中第幾條
--v_id等三個(gè)變量用于存放臨時(shí)數(shù)據(jù)
--at_end控制是否到底
------------------------------------------------------------------------
   DECLARE SQLSTATE CHAR(5);
   DECLARE v_NumOfRecd int;
   DECLARE v_Index int;
   DECLARE v_Id varCHAR(100);
   DECLARE v_ConcatedName varchar(5000);
   DECLARE v_SumOfWorkTime int;
   DECLARE at_end INT DEFAULT 0;


   DECLARE not_found CONDITION FOR SQLSTATE '02000';
   DECLARE C1 CURSOR FOR
     SELECT id, count(*)
     FROM FromTable   
     GROUP BY id
     ORDER BY id;
   
   DECLARE CONTINUE HANDLER FOR not_found
     SET at_end = 1;

------------------------------------------------------------------------
--游標(biāo)移動(dòng)一次,就到一個(gè)新的id,id不會(huì)重復(fù),因?yàn)榻?jīng)過上面的group by
------------------------------------------------------------------------
   OPEN C1;
   Concat_Loop:
   LOOP
     FETCH C1 INTO v_Id, v_NumOfRecd;
     IF at_end = 1 THEN
       LEAVE Concat_Loop;
     END IF;
------------------------------------------------------------------------
--遇到每個(gè)id ,第一條記錄都應(yīng)該直接插入的
------------------------------------------------------------------------
        SET v_Index=1;
        SET v_ConcatedName = (SELECT name  FROM
                (SELECT ROW_NUMBER() over()  as a ,FromTable.*  FROM FromTable where id = v_Id) as x where a=v_Index );
        SET v_SumOfWorkTime = (SELECT STEPWORKTIME  FROM
                (SELECT ROW_NUMBER() over()  as a ,FromTable.* FROM FromTable where id = v_Id) as x where a=v_Index );
    INSERT INTO ToTable VALUES (v_Id, v_ConcatedName,v_SumOfWorkTime);
        SET v_Index=2;
------------------------------------------------------------------------
--如果有第二條的話,就連接名字字符串,累加STEPWORKTIME數(shù)據(jù)
------------------------------------------------------------------------
Inner_Loop:
LOOP
        IF v_Index = (v_NumOfRecd+1)  THEN
                LEAVE Inner_Loop;
        ELSE
                SET v_ConcatedName = v_ConcatedName||','||(SELECT name  FROM
                        (SELECT ROW_NUMBER() over()  as a,FromTable.* FROM FromTable where id = v_Id) as x where a=v_Index );
                SET v_SumOfWorkTime = v_SumOfWorkTime+(SELECT STEPWORKTIME  FROM
                        (SELECT ROW_NUMBER() over()  as a ,FromTable.* FROM FromTable where id = v_Id) as x where a=v_Index );
                       
        UPDATE ToTable SET name =  v_ConcatedName where id = v_Id;
        UPDATE ToTable SET num =  v_SumOfWorkTime where id = v_Id;
        SET v_Index=v_Index+1;
        END IF ;

END LOOP Inner_Loop;
   END LOOP Concat_Loop;
   CLOSE C1;
END Lable1

我的數(shù)據(jù)類型設(shè)錯(cuò)了,所以運(yùn)行改存儲(chǔ)過程后,查詢ToTable表結(jié)果會(huì)有點(diǎn)點(diǎn)出入。
D:\>;db2 select * from totable

ID
                     NAME
                                          SUM
--------------------------------------------------------------------------------
-------------------- -----------------------------------------------------------
----------------------------------------- -----------
6262
                     張三,李四,王二
                                                    5
6265
                     趙某,錢某,成某
                                                    5

  2 條記錄已選擇。

寫得不好,請(qǐng)大家多體諒下呵:)

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2005-01-23 23:44 |只看該作者

一個(gè)SQL存儲(chǔ)過程

十分感謝

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2005-01-24 09:39 |只看該作者

一個(gè)SQL存儲(chǔ)過程

樓主不用太過謙虛,實(shí)在不錯(cuò)了,
偶對(duì)游標(biāo)不是很熟,受教了

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2005-01-24 10:41 |只看該作者

一個(gè)SQL存儲(chǔ)過程

很好!

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2005-01-24 18:36 |只看該作者

一個(gè)SQL存儲(chǔ)過程

i 不錯(cuò)!

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2005-01-25 18:03 |只看該作者

一個(gè)SQL存儲(chǔ)過程

提個(gè)問題,如果fromtab等于某個(gè)值的記錄不等,你的存儲(chǔ)過程是否還成立?呵呵



如果是按照你的思路,我的意見是在CUROSR中將人名合并起來(中間用逗號(hào)或者其他符號(hào)分隔),然后UPDATE到表字段中(此字段要考慮要有充分大),如在應(yīng)用中需要逐個(gè)顯示再根據(jù)分隔符分別顯示出來

exam:  

    1234    a1, a2, a3,  a4    5.5

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2005-01-25 18:59 |只看該作者

一個(gè)SQL存儲(chǔ)過程

是這樣考慮的:

如果某個(gè)ID只有一條記錄,根據(jù)GROUP BY ,則count(*)后也會(huì)因一條
這樣也會(huì)插入ToTable一條記錄
如果某個(gè)ID相同記錄多于一條,則插入一條后繼續(xù)UPDATE

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2005-03-31 15:29 |只看該作者

一個(gè)SQL存儲(chǔ)過程

好貼,收藏了。

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2005-04-28 14:09 |只看該作者

一個(gè)SQL存儲(chǔ)過程

厲害
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP