如何分组如此重复不计算在内

时间:2014-04-20 21:21:05

标签: sql

我有这个问题:

select resorti.resort_id
      ,resorti.resort
      ,hoteli.resort_id
      ,hoteli.hotel_id
      ,hoteli.hotel
  from resorti 
       inner join 
       hoteli on resorti.resort_id = hoteli.resort_id

如果有多个具有相同名称的度假村,我如何更改此查询以便仅列出度假村的名称一次?

编辑:我更改了查询。以下是实际结果:

enter image description here

以下是所需的结果:

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以按度假村信息进行分组,但是您将丢失酒店所需的详细信息。

你真的可以更好地压制"重复"应用程序层中的度假项目。

您可以在派生表中的每个组中生成行号,然后在行号<>行时查询抑制度假村的行号1,但语法将取决于您的rdbms。

编辑:

反对我更好的判断,这里有你如何在sql服务器上做到这一点。如果没有tsql的row_number或cte,它可以更简洁。

create table resorti (resort_id INT, resort VARCHAR(50))
create table hoteli (hotel_id INT, resort_id INT, hotel VARCHAR(50))

insert into resorti values (1,'resort_1'),(2,'resort_2')
insert into hoteli values (1,1,'hotel_1a'),(2,1,'hotel_1b'), (3,2,'hotel_2a'),(4,2,'hotel_2b')


;with cte as (
  SELECT *
        ,ROW_NUMBER() OVER (PARTITION BY resort_id ORDER BY hotel_id) rn
    FROM hoteli
)
select case when rn=1 then resorti.resort_id end resort_id
      ,case when rn=1 then resorti.resort end resort
      ,resorti.resort
      ,cte.hotel_id
      ,cte.hotel
  from resorti 
       inner join 
       cte on resorti.resort_id = cte.resort_id

答案 1 :(得分:0)

请提供有关您的数据库的更多信息...如果您按resort进行分组,并且有两行具有相同的名称但resort_id不同,那么只有在您不知道的情况下才能进行分组选择resort_id。或者,表resorti的第二个选定列由以下函数之一计算:SUM,AVG,MAX,MIN和COUNT

尝试这样的事情

SELECT
    resorti.resort,
    hoteli.hotel_id,
    hoteli.hotel

FROM resorti

INNER JOIN hoteli ON resorti.resort_id = hoteli.resort_id

GROUP BY resorti.resort