SQL-запрос (может быть, простой) - PullRequest
0 голосов
/ 15 сентября 2009

Так что у меня эта проблема.

У меня есть две таблицы (Oracle), одна называется Destination, а другая - Резервная. Резерв имеет внешний ключ для идентификатора пункта назначения (поскольку в резерве есть один пункт назначения). А резервные кортежи означают все резервы, которые сделали все пользователи. Мне нужен способ проверить 3 самых посещаемых пункта назначения (на основе внешнего ключа в таблице «Резерв»).

Как я могу сделать это с SQL в Oracle. Я знаю, что мне нужно искать в таблицах резервирования 3 наиболее повторяющихся идентификатора пунктов назначения, а затем объединить их с таблицей адресатов, чтобы получить подробную информацию о трех лучших пунктах назначения.

Любая помощь действительна. Большое спасибо.

SCHEMA:

--------------------------------------------------------
--  File created - martes-septiembre-15-2009   
--------------------------------------------------------
--------------------------------------------------------
--  DDL for Table DESTINO
--------------------------------------------------------

  CREATE TABLE "S2501A29"."DESTINO" 
   (    "PK_ID_DESTINO" NUMBER(10,0), 
    "FK_COD_UBICACION_GEOGRAFICA" NUMBER(10,0), 
    "NOMBRE" VARCHAR2(10), 
    "FOTO" VARCHAR2(30), 
    "DESCRIPCION" VARCHAR2(50)
   ) ;
--------------------------------------------------------
--  DDL for Table LUGAR_ESTADIA
--------------------------------------------------------

  CREATE TABLE "S2501A29"."LUGAR_ESTADIA" 
   (    "PK_ID_ESTADIA" NUMBER(10,0), 
    "NOMBRE" VARCHAR2(10), 
    "TIPO" VARCHAR2(10), 
    "DESCRIPCION" VARCHAR2(50), 
    "COSTO_SERVICIOS" NUMBER, 
    "DESCRIPCION_ALOJAMIENTO" VARCHAR2(100), 
    "DESCRIPCION_ALIMENTACION" VARCHAR2(100)
   ) ;
--------------------------------------------------------
--  DDL for Table OPCION_TRANSPORTE
--------------------------------------------------------

  CREATE TABLE "S2501A29"."OPCION_TRANSPORTE" 
   (    "PK_ID_VIAJE" NUMBER(10,0), 
    "MEDIO_TRANSPORTE" VARCHAR2(10), 
    "RESPONSABLE" VARCHAR2(10), 
    "CIUDAD_ORIGEN" VARCHAR2(10), 
    "CIUDAD_DESTINO" VARCHAR2(10), 
    "COSTO" NUMBER
   ) ;
--------------------------------------------------------
--  DDL for Table RESERVA
--------------------------------------------------------

  CREATE TABLE "S2501A29"."RESERVA" 
   (    "PK_ID_RESERVA" NUMBER(10,0), 
    "FK_COD_DESTINO" NUMBER(10,0), 
    "FK_COD_ESTADIA" NUMBER(10,0), 
    "FK_COD_VIAJE" NUMBER(10,0), 
    "TARJETA_CREDITO" VARCHAR2(12), 
    "FECHA_SALIDA" DATE, 
    "FECHA_REGRESO" DATE, 
    "NOMBRE_USUARIO" VARCHAR2(50)
   ) ;
--------------------------------------------------------
--  DDL for Table UBICACION_GEOGRAFICA
--------------------------------------------------------

  CREATE TABLE "S2501A29"."UBICACION_GEOGRAFICA" 
   (    "PK_ID_UBICACION" NUMBER(10,0), 
    "CIUDAD" VARCHAR2(10), 
    "PAIS" VARCHAR2(10), 
    "CONTINENTE" VARCHAR2(10)
   ) ;

Просто примечание:

РЕЗЕРВ - Ресерва DESTINATION - это Destino

Потому что БД на испанском. Спасибо!

Ответы [ 4 ]

2 голосов
/ 15 сентября 2009

Может быть, я что-то упустил, но как насчет группировки по внешнему ключу и сортировки по полученным значениям?

Редактировать: Что-то вроде:

select FK_COD_DESTINO, count(*) as qty from RESERVA group by FK_COD_DESTINO order by qty desc limit 3
1 голос
/ 15 сентября 2009

вы можете попробовать HAVING rownum <= 3 </p>

1 голос
/ 15 сентября 2009

Oracle не поддерживает limit. Это должно работать для вас.

select A.FK_COD_DESTINO
     , A.COUNT
     , A.RANK
     , B.*
  from (select FK_COD_DESTINO
             , count(*) as COUNT
             , rank() over (order by count(*) desc) as RANK
          from RESERVA
         group by FK_COD_DESTINO) A
  join DESTINO B on B.PK_ID_DESTINO = A.FK_COD_DESTINO
 where A.RANK <= 3
1 голос
/ 15 сентября 2009

Как насчет:

WITH CountsByDestination
AS
(
  SELECT FK_COD_DESTINO, 
         COUNT(*) CNT
  FROM Reservations
  GROUP BY DestinationId
),
RankingByDestination
AS
(
  SELECT FK_COD_DESTINO,
         CNT,
         RANK() OVER (ORDER BY CNT) RNK
  FROM CountsByDestination
)
SELECT *
FROM RankingByDestination R
INNER JOIN Destinations D ON D.PK_ID_DESTINO = R.FK_COD_DESTINO
WHERE R.RNK BETWEEN 1 AND 3
ORDER BY R.RNK

При этом сохраняются связи, поэтому, если два или более адресатов имеют одинаковые значения, они должны отображаться как часть набора результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...