将表中的结果汇总为重复值

时间:2019-09-27 14:36:52

标签: sql sql-server duplicates counting distinct-values

我目前处在一个棘手的情况下,我一直无法弄清,我希望大家都能帮助我解决以下问题:

我有一个包含大量列的数据集,但是我只会显示与我的问题相关的列(并且我将其重命名并将其放在Excel文档中)。

我要做的是开发一个SQL查询,以计算PASS结果的总量,然后计算给定房屋名称的FAIL结果的数量。每个结果对应一个特定的居民ID,每个居民ID对应一个特定的房屋名称/房屋ID。不幸的是,值“房间ID”需要包含在此数据集中,并且每个唯一的“房间ID”也对应于特定的“房屋名称/房子ID”。因此,对于给定房屋名称存在的每个唯一的房间ID,都会重复其居民ID。

例如,如果有7个与特定房屋名称/房屋ID相关联的房间ID,则与该特定房屋名称/房屋ID相关联的每个唯一居民ID将重复7次,每个唯一房间ID重复一次。因此,结果也全部重复7次。我已经附上了下面的数据示例。

注意:此处未包含所有数据。 AAAAAA数据还有更多的行未显示,并且还有许多其他的房屋名称/房屋ID。

任何想法都将不胜感激!

1 个答案:

答案 0 :(得分:0)

您正在寻找的是GROUP BY。

如果不查看您的数据,很难提出确切的查询,但是我创建了一些测试数据。

create table House (HouseId int, HouseName nvarchar(max));
insert into House (HouseId, HouseName) values (1,'House A'), (2, 'House B'), (3,'House C');

create table Room (RoomId int, RoomName nvarchar(max), HouseId int);
insert into Room (RoomId, RoomName, HouseId) 
values 
  (1,'Room 1 in house A', 1), (2,'Room 2 in house A', 1),
  (3,'Room 3 in house B', 2),(4,'Room 4 in house B', 2),
  (5,'Room 5 in house C', 3),(6,'Room 6 in house C', 3)

create table Resident (ResidentId int, ResidentName nvarchar(max), RoomId int, Result int);
insert into Resident (ResidentId, ResidentName, RoomId, Result)
values 
-- House A = 4 passed, 0 failed
(1, 'Resident 1 in Room 1', 1, 82), (2, 'Resident 2 in Room 1', 1, 76),
(3, 'Resident 3 in Room 2', 2, 91), (4, 'Resident 4 in Room 2', 2, 67),
-- House B = 2 passed, 2 failed
(5, 'Resident 5 in Room 3', 3, 60), (6, 'Resident 6 in Room 3', 3, 64),
(7, 'Resident 7 in Room 4', 4, 28), (8, 'Resident 8 in Room 4', 4, 42),
-- House C = 3 passed, 1 failed
(9, 'Resident 9 in Room 5', 5, 99), (10, 'Resident 10 in Room 5', 5, 57),
(9, 'Resident 11 in Room 6', 6, 75), (10, 'Resident 12 in Room 6', 6, 38)

然后您的查询将类似于:

select
  HouseName,
  [Passed] = SUM(x.Passed),
  [Failed] = SUM(x.Failed)
 from
   Resident re
   outer apply (
       --// Logic to determine if they passed or failed
       --// I arbitrarily chose the number 50 to be the threshold
      select [Passed] = case when re.Result >= 50 then 1 else 0 end,
       [Failed] = case when re.Result < 50 then 1 else 0 end
    ) x
   inner join Room r on r.RoomId = re.RoomId
   inner join House h on h.HouseId = r.HouseId
  group by
    h.HouseName

这是一个小提琴:http://sqlfiddle.com/#!18/30894/1