Заполнение уникальной записи в SQL

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть несколько примеров записей ниже. Меня интересует подсчет записей идентификаторов, где они имеют только значения X. Например, мне нужно посчитать ID = 10720 и 11120, поскольку оба имеют только значения X. Если у них есть значения X и другие, подобные XY или AB, например, ID = 10586, я бы не стал это считать.

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

 ID  LocationCode        Dates
10720   VA  X       3/20/2012 1:00:00 PM
10586   DC  X       7/12/2003 7:00:00 AM
10586   DC  X       8/2/2003 4:44:25 AM
10586   DC  XY      2/21/2019 8:00:00 AM
10892   NY  X       5/3/2009 4:00:00 PM
10892   NY  X       5/5/2009 6:30:00 AM
10892   NY  X       5/7/2009 11:45:00 AM
10892   CA  AB      4/5/2016 8:40:00 AM
10932   CA  AB      8/3/2009 4:00:00 AM
10932   CA  AB      8/11/2009 5:30:00 PM
10932   CA  X       5/8/2010 4:00:00 AM
11120   FL  X       11/25/2010 10:27:00 AM
11120   FL  X       12/8/2010 9:02:00 PM
11120   FL  X       12/28/2010 10:30:00 AM
  

Шаг 1:

 select 
  location,
  string_agg(code, '') as CODE,
  count(distinct ID) as count
from TEMP
group by location
  

Шаг 2: выводим результат в электронную таблицу и отфильтровываем уникальные значения X.

Есть ли в SQL Server способ, который может выдавать результат напрямую?

Ответ №1:

Другой способ сделать :

 select count(*)  
from     
(
select id table where code = 'X'    
EXCEPT
select id from where code != 'X'    
) tmp
  

Ответ №2:

Просто сделайте:

 select count(distinct id)
from t
where not exists (select 1 from t t2 where t2.id = t.id and t2.code <> 'X');
  

Или, если вы предпочитаете, два уровня агрегирования:

 select count(*)
from (select id
      from t
      group by id
      having min(code) = max(code) and min(code) = 'X'
     ) x;
  

Ответ №3:

Одно из возможных решений:

 select ID 
from TEMP
where Code = 'X'
group by ID
having count(distinct Code) = 1
  

Комментарии:

1. Спасибо всем за их вклад! Джоуи

Ответ №4:

Суммирование полученных результатов даст общее значение для ‘X’.

Что-то вроде

     select code, sum(count) as count 
    from (
        select 
        location,
        string_agg(code, '') as CODE,
        count(distinct ID) as count
        from TEMP
        group by location
    ) codes_aggregated
    group by code
    having code = 'X'