Суммирование результатов в таблице для повторных значений - PullRequest
0 голосов
/ 27 сентября 2019

Я сейчас нахожусь в сложной ситуации, которую мне не удалось выяснить, и я надеялся, что вы все сможете помочь мне решить мою проблему ниже:

У меня есть набор данных, который включает в себябольшое количество столбцов, однако я собираюсь показать только столбцы, относящиеся к моей проблеме (и я переименовал их и поместил их в документ Excel).

Я пытаюсь разработать SQL-запросрассчитать общее количество результатов PASS, а затем количество результатов FAIL для данного названия дома.Каждый результат соответствует определенному идентификатору резидента, а каждый идентификатор резидента соответствует определенному названию дома / идентификатору дома.К сожалению, значение ID комнаты должно присутствовать в этом наборе данных, и каждый уникальный ID комнаты также соответствует определенному названию дома / идентификатору дома.Следовательно, для каждого уникального идентификатора комнаты, который существует для данного названия дома, идентификатор жильца повторяется.

Например, если есть 7 идентификаторов комнат, связанных с определенным названием дома / идентификатором дома, каждый уникальный резидентИдентификатор, связанный с этим конкретным названием дома / идентификатором дома, будет повторяться 7 раз, один раз для каждого уникального идентификатора комнаты.Таким образом, результаты также все повторяются 7 раз.Ниже я привел пример того, как выглядят данные.

Примечание: сюда включены не все данные.Есть еще несколько строк в данных AAAAAA, которые не показаны, и есть ряд других названий домов / идентификаторов домов.

Любые мысли будут высоко оценены!

1 Ответ

0 голосов
/ 28 сентября 2019

То, что вы ищете, это 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

...