Как найти количество уникальных значений 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, то их необходимо подсчитывать

задан 6 ноя 2012 в 20:53

co11ter's user avatar

co11terco11ter

5791 золотой знак7 серебряных знаков22 бронзовых знака

Первая интерпретация вашего вопроса
Для каждого 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

Унифицировать или нет дело ваше, смотря что там лежит и как

Deleted's user avatar

Deleted

3611 золотой знак5 серебряных знаков13 бронзовых знаков

ответ дан 7 ноя 2012 в 0:39

ЫЫЫ's user avatar

ЫЫЫЫЫЫ

1,3786 серебряных знаков7 бронзовых знаков

6

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
Вот как бы и всё ))

ответ дан 6 ноя 2012 в 21:31

Deonis's user avatar

DeonisDeonis

33.7k1 золотой знак30 серебряных знаков49 бронзовых знаков

3

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

Дух сообщества's user avatar

ответ дан 6 ноя 2012 в 21:15

vlukham's user avatar

vlukhamvlukham

1681 серебряный знак11 бронзовых знаков

4

Йоксель!

select name, count(distinct emp_id)
from my_temp
group by name
;

ответ дан 8 ноя 2012 в 6:54

orkaan's user avatar

orkaanorkaan

7283 серебряных знака8 бронзовых знаков

У функции count есть еще одна форма — count(DISTINCT выражение). При такой форме записи функция вернет количество уникальных значений, при этом NULL значения по прежнему не учитываются. Например:

SELECT *
  FROM table1
value
1
2
2
2
3
3
NULL
NULL
SELECT count(value) AS count_value,
       count(DISTINCT value) AS count_distinct_value
  FROM table1
count_value count_distinct_value
6 3

Уникальными значениями value таблицы table1 являются 1, 2 и 3.

Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Агрегация (COUNT)

Основы аналитики на SQL

Для получения общей картины или определения некоторых характеристик данных, содержащихся в базе, полезно начать работу с использования функции COUNT.

Функция COUNT называется агрегирующей, потому что она собирает или «складывает» информацию из нескольких строк данных в одно значение. Это позволяет подсчитать количество элементов в группе или наборе данных и представить эту информацию в виде одного числа. Агрегирующие функции, такие как COUNT, используются для упрощения и обобщения данных, чтобы сделать их более понятными и удобными для анализа.

Для демонстрации работы COUNT продолжим работать с базой из предыдущего примера.

Подсчет общего количества строк и значений столбца

Предположим мы хотим произвести подсчет общего количества продаж. Для этого выполним следующий запрос.

SELECT COUNT(*) AS total_sales
FROM sales;

Результат:

Untitled

Мы получим такой же результат если вместо звездочки используем наименование какого-либо столбца из указанной таблицы.

SELECT COUNT(sale_date) AS total_sales
FROM sales;

Результат:

Untitled

При передаче функции COUNT звездочки в качестве аргумента мы подсчитываем количество всех строк нашей таблицы, независимо от их значений. Поэтому в расчет берутся столбцы, содержащие как определенные значения, так и значения NULL.

Разница между COUNT(*) и COUNT(название_столбца) заключается в том, как они обрабатывают NULL значения в столбцах:

  1. COUNT(): Подсчитывает все строки в выборке, независимо от того, содержат ли они значения NULL или нет. Это означает, что COUNT() возвращает общее количество строк в выборке или таблице.
  2. COUNT(название_столбца): Подсчитывает только строки, в которых значение столбца НЕ является NULL. Если значение столбца равно NULL, эта строка не будет учтена в общем количестве.

В большинстве случаев COUNT() и COUNT(названиестолбца) дадут одинаковые результаты, если столбец, указанный в COUNT(), не содержит NULL значений. Однако, если столбец содержит значения NULL, COUNT(названиестолбца) будет меньше, чем COUNT(), так как строки с NULL значениями не будут учтены.

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

Используя COUNT и DISTINCT вместе, можно решать аналитические задачи, которые связаны с подсчетом уникальных значений в определенных столбцах.

Например, узнаем количество уникальных категорий продуктов в нашем базе.

SELECT COUNT(DISTINCT category) AS unique_categories
FROM products;

Результат:

Untitled

Если нам нужно выбрать уникальные комбинации значений из нескольких столбцов, можно использовать DISTINCT с несколькими колонками.

Например, подсчитаем уникальные комбинации продуктов и их категорий.

SELECT COUNT(DISTINCT product_name || '_' || category)
AS unique_product_categories
FROM products;

Результат:

Untitled

В некоторых СУБД как SQLite или MySQL, мы не сможем напрямую использовать COUNT(DISTINCT названиестолбца1, названиестолбца2). Вместо этого используем функцию || (конкатенация строк) для объединения значений из нескольких столбцов, а затем применить COUNT(DISTINCT …).

Заключение.

  • cry_san

Есть таблица orders:
id|user_id
в этой таблице все заказы всех пользователей

как подсчитать сколько вообще уникальных пользователей user_id в этой таблице?

отдельной таблицы users нет, поэтому подсчитать нормально нет возможности


  • Вопрос задан

    более трёх лет назад

  • 52784 просмотра

Пригласить эксперта

Запрос выше выдаст список уникальных значений

Этот запрос выведет количество
SELECT COUNT(DISTINCT user_id) FROM orders

Господа, вы должно быть шутите.

SELECT userId,COUNT(userId)
FROM orders
GROUP BY userId


  • Показать ещё
    Загружается…

24 мая 2023, в 18:20

50000 руб./за проект

24 мая 2023, в 18:17

5000 руб./за проект

24 мая 2023, в 18:00

1000 руб./за проект

Минуточку внимания

Imagine I have table like this:

id:Product:shop_id

1:Basketball:41

2:Football:41

3:Rocket:45

4:Car:86

5:Plane:86

Now, this is an example of large internet mall, where there are shops which sell to one customer, so customer can choose more products from each shop and buy it in one basket.

However, I am not sure if there is any SQL syntax which allows me to simply get unique shop_ids and total number of those shops’ products in customer basket. So I’d get something like:

Shop 41 has 2 products

Shop 45 one product

Shop 86 two product

I can make SQL queries to scoop through table to make some kind of [‘shop_id’][‘number_of_products’] array variable that would store all products’ shop_ids, then «unique them» — up and count how many times I had to cut one more shop_id out to have some remaining but that just seems as a lot of useless scripting.

If you got some nice and neat idea, please, let me know.

Понравилась статья? Поделить с друзьями: