REFERENCIA CRUZADA NO ORACLE 10.2
Bom dia Colegas!
Eu tenho a seguinte consulta:
Este código me retorna os seguintes dados:
SEQ DATA ID BATIDA
1 27/05/13 134013 10:59
2 27/05/13 134013 13:42
3 27/05/13 134013 15:11
4 27/05/13 134013 20:05
Eu queria que os dados viessem desta forma:
DATA ID b1 b2 b3 b4
27/05/13 134013 10:59 13:42 15:11 20:05
Minha versão do Banco é a 10.2.
Grato pela atenção.
Luiz Manoel
Eu tenho a seguinte consulta:
select rownum seq, bti_dtdbatidadata data,
btc_cdicontratado id,
to_CHAR(BTI_HRDBATIDAHORAMINUTO, 'HH24:MI') BATIDA
from apd.conbatidasreaisclassifs
left join apd.conbatidasreaisclassifsits on BTI_CDICONBATIDAREALCLASSIF =
BTC_CDICONBATIDAREALCLASSIF
WHERE bti_dtdbatidadata BETWEEN '&data_inicial' AND '&data_final'
and btc_cdicontratado = 134013Este código me retorna os seguintes dados:
SEQ DATA ID BATIDA
1 27/05/13 134013 10:59
2 27/05/13 134013 13:42
3 27/05/13 134013 15:11
4 27/05/13 134013 20:05
Eu queria que os dados viessem desta forma:
DATA ID b1 b2 b3 b4
27/05/13 134013 10:59 13:42 15:11 20:05
Minha versão do Banco é a 10.2.
Grato pela atenção.
Luiz Manoel
Luiz Manoel
Curtidas 0
Respostas
Carlos Tangerino
29/05/2013
Luiz, o que mais se aproxima do que você precisa é o código abaixo:
DECLARE
CURSOR c1 IS
-- Cursor com GROUP BY para agrupar aquilo se repete em apenas uma linha
SELECT sequencia,
DATA,
COUNT(batida)
FROM tabela
GROUP BY sequencia,
DATA;
--
-- Cursor para a partir dos campos comuns selecionados no Cursor C1, selecionar aquilo que não é comum
CURSOR c2
(
psequencia VARCHAR2,
pdata DATE
) IS
SELECT batida
FROM tabela
WHERE sequencia = psequencia
AND DATA = pdata;
--
vsequencia VARCHAR2(50);
vdata DATE;
vbatida VARCHAR2(32000);
--
BEGIN
FOR r1 IN c1
LOOP
vsequencia := r1.sequencia;
vdata := r1.data;
FOR r2 IN c2(r1.sequencia, r1.data)
LOOP
IF vbatida IS NULL THEN
vbatida := r2.vbatida;
ELSE
vbatida := vbatida || ' ' || r2.vbatida;
END IF;
END LOOP;
END LOOP;
--
dbms_output.put_line(vsequencia || ' ' || to_char(vdata, 'dd/mm/rrrr') || ' ' || vbatida);
--
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('WHEN OTHERS: '||SQLERRM);
END;
Tem uma função chamada PIVOT mas é para o 11g, mesmo assim, acredito que para o seu caso, que não tem soma, não sei se dará muito certo.
Espero ter colaborado ou deixado alguma pista pra uma solução mais breve.
Abraço,
DECLARE
CURSOR c1 IS
-- Cursor com GROUP BY para agrupar aquilo se repete em apenas uma linha
SELECT sequencia,
DATA,
COUNT(batida)
FROM tabela
GROUP BY sequencia,
DATA;
--
-- Cursor para a partir dos campos comuns selecionados no Cursor C1, selecionar aquilo que não é comum
CURSOR c2
(
psequencia VARCHAR2,
pdata DATE
) IS
SELECT batida
FROM tabela
WHERE sequencia = psequencia
AND DATA = pdata;
--
vsequencia VARCHAR2(50);
vdata DATE;
vbatida VARCHAR2(32000);
--
BEGIN
FOR r1 IN c1
LOOP
vsequencia := r1.sequencia;
vdata := r1.data;
FOR r2 IN c2(r1.sequencia, r1.data)
LOOP
IF vbatida IS NULL THEN
vbatida := r2.vbatida;
ELSE
vbatida := vbatida || ' ' || r2.vbatida;
END IF;
END LOOP;
END LOOP;
--
dbms_output.put_line(vsequencia || ' ' || to_char(vdata, 'dd/mm/rrrr') || ' ' || vbatida);
--
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('WHEN OTHERS: '||SQLERRM);
END;
Tem uma função chamada PIVOT mas é para o 11g, mesmo assim, acredito que para o seu caso, que não tem soma, não sei se dará muito certo.
Espero ter colaborado ou deixado alguma pista pra uma solução mais breve.
Abraço,
GOSTEI 0