oracle sql 生成重复字符串,SQL高手帮忙,由多行生成字符串,该如何解决

当前位置:我的异常网» Oracle开发 » SQL高手帮忙,由多行生成字符串,该如何解决

SQL高手帮忙,由多行生成字符串,该如何解决

www.myexceptions.net  网友分享于:2013-01-16  浏览:51次

SQL高手帮忙,由多行生成字符串

有表A:

orderNo     frameId     qty

001               1-001         10

001               1-002         10

001               1-001         10

:                       :               :   --可能同一个orderNo有多个frameId

002               1-101         10

:                     :                 :

我要得到:

orderNo               remark

001             [1-001:20],[1-002:10]...

002             [1-101:10]...

我想用function生成remark的内容,但不熟Oracle,无从下手。

请大家支招!

------解决方案--------------------

参考一下这个:

oracle中的group by实现字符型字段求和[ZT from Dev-club,原创:Xiaoyun]

-------------------------------------------------

SELECT A , SUM( B ) FROM MyTab GROUP BY A ;

这是大家再熟悉不过的写法,这是根据A列统计B列的和。

有些时候,B列是字符串类型的列,就像这样

A | B

---------------

a aa

a bb

a cc

139045771 33

139045771 44

139045771 55

a dd

我想要得到这样的结果:

139045771 33,44,55

a aa,bb,cc,dd

相当于想要把字符串“加和”

解决的方式如下,麻烦了一点

先编译这个函数SumString

CREATE OR REPLACE FUNCTION SumString(

I_TableName IN VARCHAR2 ,

I_GroupColName IN VARCHAR2 ,

I_ResultColName IN VARCHAR2 ,

I_GroupColValue IN VARCHAR2 ,

I_Separator IN VARCHAR2

)

RETURN VARCHAR2 IS

TYPE T_Cur IS REF CURSOR ;

C_Cur T_Cur ;

V_Sql VARCHAR2(2000) ;

V_Result VARCHAR2(2000) ;

V_Tmp VARCHAR2(200) ;

V_Cnt NUMBER := 0 ;

BEGIN

V_Result := ' ' ;

V_Sql := 'SELECT '|| I_ResultColName || ' FROM '|| I_TableName || ' WHERE '|| I_GroupColName || ' = ' ' '|| I_GroupColValue || ' ' ' ' ;

OPEN C_Cur FOR V_Sql ;

LOOP

FETCH C_Cur INTO V_Tmp ;

EXIT WHEN C_Cur%NOTFOUND ;

IF V_Cnt = 0 THEN

V_Result := V_Tmp ;

ELSE

V_Result := V_Result || I_Separator || V_Tmp ;

END IF ;

V_Cnt := V_Cnt + 1 ;

END LOOP ;

CLOSE C_Cur ;

RETURN V_Result ;

END SUMSTRING;

再执行以下语句测试:

CREATE TABLE TestSumString( a VARCHAR2(10) , b VARCHAR2(10) ) ;

INSERT INTO TestSumString VALUES( 'a ' , 'aa ' ) ;

INSERT INTO TestSumString VALUES( 'a ' , 'bb ' ) ;

INSERT INTO TestSumString VALUES( 'a ' , 'cc ' ) ;

INSERT INTO TestSumString VALUES( '139045771 ' , '33 ' ) ;

INSERT INTO TestSumString VALUES( '139045771 ' , '44 ' ) ;

INSERT INTO TestSumString VALUES( '139045771 ' , '55 ' ) ;

INSERT INTO TestSumString VALUES( 'a ' , 'dd ' ) ;

COMMIT ;

SELECT A , SumString( 'TestSumString ', 'a ' , 'b ' , a , ', ' ) SUM_B FROM TestSumString GROUP BY A ;

运行结果如下:

A SUM_B

---------- ---------------

139045771 33,44,55

a aa,bb,dffdfd,dd

和普通的GroupBy使用方法上没什么不同

文章评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值