#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'