Pregunta

Hice una consulta que obtiene todas las habitaciones con su nombre, su dirección y otros datos.

(select replace(wm_concat( '\par \tab ' || s.address|| '\par \tab ' || s.lib || '\par \tab '), ',', '\par - ')
 from t_room s)

Demasiado largo para todos los datos, los únicos datos importantes son el nombre y la dirección.

El hecho es que 2 habitaciones pueden tener la misma dirección, por lo que en el resultado no quiero:

room1 address1 - room2 address1

Eso, realmente entiendo, pero

room1 address1 - room2 at the same address

¿Es esto posible en Oracle 10?

Intenté agregar un distinto para el campo de la dirección, pero por supuesto no es posible.

Gracias.

¿Fue útil?

Solución

Puedes lograr eso usando LAG función:

CREATE TABLE t_room_s (
  room VARCHAR2(20),
  address VARCHAR2(20)
);

INSERT INTO t_room_s VALUES ('room1', 'addr 1');
INSERT INTO t_room_s VALUES ('room2', 'addr 1');
INSERT INTO t_room_s VALUES ('room3', 'addr 2');
INSERT INTO t_room_s VALUES ('room4', 'addr 3');
INSERT INTO t_room_s VALUES ('room5', 'addr 4');
INSERT INTO t_room_s VALUES ('room6', 'addr 4');
INSERT INTO t_room_s VALUES ('room7', 'addr 4');
INSERT INTO t_room_s VALUES ('room8', 'addr 5');

SELECT wm_concat(room || ' ' || addr) AS val
  FROM (
    SELECT
        room,
        CASE
          WHEN LAG(address, 1, NULL) OVER (ORDER BY address) = address THEN 'same address'
          ELSE address
        END AS addr
      FROM
        t_room_s
    ORDER BY address
  )
;

Producción:

VAL
-------------------------------------------------------------------------------------------------------------------------
room1 addr 1,room2 same address,room3 addr 2,room4 addr 3,room5 addr 4,room6 same address,room7 same address,room8 addr 5
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top