2013-05-16 6 views
0

Недавно я обнаружил, что мы можем использовать функцию Max (Decode()) Oracle для поворота результатов таблицы. Я выполнил это просто отлично. Однако поворот таблицы - это всего лишь одна часть необходимого мне решения. Функция поворота приводит к чему-то вроде этого:Подсчет последовательных чисел в одну строку

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 

Спасибо, что помогли ребятам.

+0

Было бы лучше использовать 'case ~ when' для сложных условий. – ntalbs

+0

привет, ntalbs, можете ли вы дать мне образец того, как я могу начать это? – GianIsTheName

+0

Я неправильно понял ваш вопрос. Если вы хотите уменьшить число последовательных номеров до диапазона (например: 01,02,03 -> 1-3 и 02,03,04 -> 2-4), тогда 'case ~ when' вам не поможет. – ntalbs

ответ

0
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 
Смежные вопросы