Есть таблица 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
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
3611 золотой знак5 серебряных знаков13 бронзовых знаков
ответ дан 7 ноя 2012 в 0:39
ЫЫЫЫЫЫ
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
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
ответ дан 6 ноя 2012 в 21:15
vlukhamvlukham
1681 серебряный знак11 бронзовых знаков
4
Йоксель!
select name, count(distinct emp_id)
from my_temp
group by name
;
ответ дан 8 ноя 2012 в 6:54
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;
Результат:
Мы получим такой же результат если вместо звездочки используем наименование какого-либо столбца из указанной таблицы.
SELECT COUNT(sale_date) AS total_sales
FROM sales;
Результат:
При передаче функции COUNT звездочки в качестве аргумента мы подсчитываем количество всех строк нашей таблицы, независимо от их значений. Поэтому в расчет берутся столбцы, содержащие как определенные значения, так и значения NULL.
Разница между COUNT(*) и COUNT(название_столбца) заключается в том, как они обрабатывают NULL значения в столбцах:
- COUNT(): Подсчитывает все строки в выборке, независимо от того, содержат ли они значения NULL или нет. Это означает, что COUNT() возвращает общее количество строк в выборке или таблице.
- COUNT(название_столбца): Подсчитывает только строки, в которых значение столбца НЕ является NULL. Если значение столбца равно NULL, эта строка не будет учтена в общем количестве.
В большинстве случаев COUNT() и COUNT(названиестолбца) дадут одинаковые результаты, если столбец, указанный в COUNT(), не содержит NULL значений. Однако, если столбец содержит значения NULL, COUNT(названиестолбца) будет меньше, чем COUNT(), так как строки с NULL значениями не будут учтены.
Подсчет количества уникальных значений
Используя COUNT и DISTINCT вместе, можно решать аналитические задачи, которые связаны с подсчетом уникальных значений в определенных столбцах.
Например, узнаем количество уникальных категорий продуктов в нашем базе.
SELECT COUNT(DISTINCT category) AS unique_categories
FROM products;
Результат:
Если нам нужно выбрать уникальные комбинации значений из нескольких столбцов, можно использовать DISTINCT с несколькими колонками.
Например, подсчитаем уникальные комбинации продуктов и их категорий.
SELECT COUNT(DISTINCT product_name || '_' || category)
AS unique_product_categories
FROM products;
Результат:
В некоторых СУБД как SQLite или MySQL, мы не сможем напрямую использовать COUNT(DISTINCT названиестолбца1, названиестолбца2). Вместо этого используем функцию ||
(конкатенация строк) для объединения значений из нескольких столбцов, а затем применить COUNT(DISTINCT …).
Заключение.
Есть таблица 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.