Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Подсчет уникальных значений

#sql


Есть таблица org (name, emp_id). Для каждого возможного значения name, необходимо
вывести количество уникальных emp_id. Можно ли это сделать с помощью count() или как ещё?
UPD: Немного расшифрую. Допустим 
(name)  (emp_id)
apple   85962
apple   14654
intel   14654
intel   14654

В результате необходимо получить что-то вроде
(name)  count(emp_id)
apple   2
intel   1

т.е. если emp_id повторяется в разных name, то их необходимо подсчитывать    


Ответы

Ответ 1



Первая интерпретация вашего вопроса Для каждого name подсчитать уникальное количество emp_id SELECT name, COUNT(DISTINCT emp_id) AS qty FROM org GROUP BY name Вторая интерпретация, подсчитать так, что бы исключить emp_id встречающиеся у разных name Для этого пойдем от обратного подсчитаем количество name у emp_id, то есть нам необходимо исключить из выборки emp_id встречающиеся у нескольких name SELECT name, COUNT(DISTINCT emp_id) AS qty FROM org WHERE NOT emp_id IN ( SELECT emp_id FROM org GROUP BY emp_id HAVING COUNT(DISTINCT name) > 1 ) GROUP BY name Унифицировать или нет дело ваше, смотря что там лежит и как

Ответ 2



SELECT `emp_id` FROM `table_name` GROUP BY `emp_id` HAVING COUNT(`emp_id`) = 1 UPD Как-то всё уж очень мудрёно у всех получается. )) Если надо сравнивать не только значение поля emp_id, но и соответствующее ему поле name, то почему бы их не объединить? SELECT `emp_id`, CONCAT(`name`,`emp_id`) AS uv FROM `uniq` GROUP BY uv HAVING COUNT(uv) = 1 Вот что мы получим в итоге: http://sqlfiddle.com/#!2/afac1/1 Всё, что теперь остается сделать, так это высчитать количество уникальных записей и сгруппировать по полю name. Итоговый запрос: SELECT t1.`name`,COUNT(t1.`emp_id`) AS cnt FROM `uniq` t1 WHERE CONCAT(t1.`name`,t1.`emp_id`) IN ( SELECT CONCAT(t2.`name`,t2.`emp_id`) AS uv FROM `uniq` t2 GROUP BY uv HAVING COUNT(uv) = 1 ) GROUP BY t1.`name` Желающим посмотреть в действии - http://sqlfiddle.com/#!2/afac1/14/0 Вот как бы и всё ))

Ответ 3



Йоксель! select name, count(distinct emp_id) from my_temp group by name ;

Ответ 4



group by name может быть? А дальше их distinct update 1 ok, см сюда Mysql: Select unique values ​​within the group? Ну в любом случае, будут вложенные запросы. update 2 select t1, count(t2) as t4 from ( select substring(new1,0,charindex('/',new1)) as t1, substring(new1,charindex('/',new1)+1,len(new1)) as t2, new1 from (select distinct name + '/' + emp_id as new1 from org) temp1 ) temp2 group by t1

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

Отправить комментарий