Oracle 将连续的数字计算成一行

Oracle 将连续的数字计算成一行,oracle,Oracle,我最近发现,我们可以使用Oracle的Max(Decode())函数来透视表的结果。我做得很好。然而,数据透视只是我需要的解决方案的一部分。旋转函数的结果如下所示: 01,02,03,05,06,07,08,09,10,11,12,13,14,16,17,20,21,23,25 1-17, 20-21,23,25 我真正需要的是这样的东西: 01,02,03,05,06,07,08,09,10,11,12,13,14,16,17,20,21,23,25 1-17, 20-21,23,25

我最近发现,我们可以使用Oracle的Max(Decode())函数来透视表的结果。我做得很好。然而,数据透视只是我需要的解决方案的一部分。旋转函数的结果如下所示:

01,02,03,05,06,07,08,09,10,11,12,13,14,16,17,20,21,23,25
1-17, 20-21,23,25
我真正需要的是这样的东西:

01,02,03,05,06,07,08,09,10,11,12,13,14,16,17,20,21,23,25
1-17, 20-21,23,25
我真的不知道如何开始解决这个问题,但到目前为止,我有以下疑问:

SELECT DISTINCT
     MAX(DECODE(wldw.wafernumber,'01', '01')) 
      || MAX(DECODE(wldw.wafernumber,'02', ',02')) 
      || MAX(DECODE(wldw.wafernumber,'03', ',03')) 
      || MAX(DECODE(wldw.wafernumber,'04', ',04')) 
      || MAX(DECODE(wldw.wafernumber,'05', ',05')) 
      || MAX(DECODE(wldw.wafernumber,'06', ',06')) 
      || MAX(DECODE(wldw.wafernumber,'07', ',07')) 
      || MAX(DECODE(wldw.wafernumber,'08', ',08')) 
      || MAX(DECODE(wldw.wafernumber,'09', ',09')) 
      || MAX(DECODE(wldw.wafernumber,'10', ',10')) 
      || MAX(DECODE(wldw.wafernumber,'11', ',11')) 
      || MAX(DECODE(wldw.wafernumber,'12', ',12')) 
      || MAX(DECODE(wldw.wafernumber,'13', ',13')) 
      || MAX(DECODE(wldw.wafernumber,'14', ',14')) 
      || MAX(DECODE(wldw.wafernumber,'15', ',15')) 
      || MAX(DECODE(wldw.wafernumber,'16', ',16')) 
      || MAX(DECODE(wldw.wafernumber,'17', ',17')) 
      || MAX(DECODE(wldw.wafernumber,'18', ',18')) 
      || MAX(DECODE(wldw.wafernumber,'19', ',19')) 
      || MAX(DECODE(wldw.wafernumber,'20', ',20')) 
      || MAX(DECODE(wldw.wafernumber,'21', ',21')) 
      || MAX(DECODE(wldw.wafernumber,'22', ',22')) 
      || MAX(DECODE(wldw.wafernumber,'23', ',23')) 
      || MAX(DECODE(wldw.wafernumber,'24', ',24')) 
      || MAX(DECODE(wldw.wafernumber,'25', ',25'))  AS WAFERS      
      , 'history' as well
FROM a_wiplothistory wl
JOIN Container C ON (wl.containerid = c.containerid OR wl.containerid= c.splitfromid )
JOIN a_wiplotdetailshistory wld ON wl.wiplothistoryid = wld.wiplothistoryid
JOIN a_wiplotdetailswafershistory wldw ON wld.wiplotdetailshistoryid = wldw.wiplotdetailshistoryid
WHERE c.containername = :lot

谢谢你们的帮助。

当用于复杂条件时,最好使用
case~。你好,ntalbs,你能给我一个如何开始的示例吗?我误解了你的问题。如果您想将连续数字缩小到范围(例如:01,02,03->1-3和02,03,04->2-4),那么
case~ when
对您没有帮助。谢谢:)您还有其他想法吗?
SELECT DISTINCT
 MAX(CASE WHEN wldw.wafernumber BETWEEN '01' AND '17' THEN '01-17' END)
  || MAX(DECODE(wldw.wafernumber,'18', ',18')) 
  || MAX(DECODE(wldw.wafernumber,'19', ',19')) 
  || MAX(CASE WHEN wldw.wafernumber IN ('20','21') THEN '20-21' END) 
  || MAX(DECODE(wldw.wafernumber,'21', ',21')) 
  || MAX(DECODE(wldw.wafernumber,'22', ',22')) 
  || MAX(DECODE(wldw.wafernumber,'23', ',23')) 
  || MAX(DECODE(wldw.wafernumber,'24', ',24')) 
  || MAX(DECODE(wldw.wafernumber,'25', ',25'))  AS WAFERS      
  , 'history' as well