Frage

Ich habe eine Abfrage erstellt, die alle Zimmer mit seinem Namen, seiner Adresse und anderen Daten bekommt.

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

Zu lang für alle Daten sind die einzigen wichtigen Daten der Name und die Adresse.

Tatsache ist, dass 2 Zimmer die gleiche Adresse haben können. Im Ergebnis möchte ich also nicht:

room1 address1 - room2 address1

das, ich bekomme tatsächlich, aber

room1 address1 - room2 at the same address

Ist das in Oracle 10 möglich?

Ich habe versucht, ein Besonderes für das Adressfeld hinzuzufügen, aber natürlich nicht möglich.

Vielen Dank.

War es hilfreich?

Lösung

Sie können das mithilfe dessen erreichen LAG Funktion:

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
  )
;

Ausgabe:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top