2008年6月10日 星期二

Recursive SQL Statement to pipe string using DB2UDB 8.2

/*以Recursive SQL語法將以下結果將COST以「,」pipe起來

NAME  COST
----  -----
ABC   101
HJK   130
HJK   206
KLM
OPU   105
OPU   109
OPU   113
OPU   117
OPU   118
OPU   199
OPU   287
OPU   288
XYZ   100
XYZ   101
XYZ   102
XYZ   203
XYZ   204


WITH   N(COL,CNT,NAME,COST) AS (
SELECT  0 COL,COUNT(*) CNT,NAME,CAST('' AS VARCHAR(1000))
FROM   ORION2
WHERE  COST > ''
GROUP  BY NAME
UNION  ALL
SELECT  N.COL + 1,N.CNT,PLUS.NAME,PLUS.COST || ',' || N.COST
FROM   (SELECT ROW_NUMBER() OVER(PARTITION BY NAME) COL,
          NAME,COST
      FROM  ORION2
      WHERE  COST > ''
      ORDER BY NAME,COST DESC) PLUS,N
WHERE  PLUS.NAME = N.NAME
AND   N.COL + 1 = PLUS.COL
AND   N.COL + 1 <= N.CNT)
SELECT NAME,SUBSTR(RTRIM(COST),1,LENGTH(RTRIM(COST))-1)
FROM   N
WHERE  COL = CNT
UNION
SELECT NAME,COST FROM ORION2 WHERE COST = ''
ORDER BY NAME;

/*結果如下:

NAME  COST
----  -------------------------------
ABC   101
HJK   130,206
KLM
OPU   105,109,113,117,118,199,287,288
XYZ   100,101,102,203,204