Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подсчет уникальных/дублей через case  [new]
Viiiiinni
Member

Откуда:
Сообщений: 5
Здравствуйте.
Нужна помощь с запросом.
В таблице столбца db и id.
С помощью case нужно посчитать количество уникальных (которые встречаются 1 раз) и неуникальных id и групировать по id.
Попытался сделать с помощью запроса ниже, но получаю ошибку 130.
Как можно исправить?
SELECT db
	,count(CASE 
			WHEN id IN (
					SELECT id
					FROM db.dbo.table02
					GROUP BY db, id
					HAVING COUNT(id) = 1
					)
				THEN id
			ELSE null
			END) unik
		,count (CASE 
			WHEN id IN (
					SELECT id
					FROM db.dbo.table02
					GROUP BY db, id
					HAVING COUNT(id) = 2
					)
				THEN inn
			ELSE null
			END) not unik
FROM db.dbo.table02
GROUP BY db
29 апр 16, 14:44    [19122153]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
... as [not unik]
29 апр 16, 14:46    [19122168]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Что-то мне подсказывает запрос подойдет такой:
SELECT db, COUNT_BIG(DISTINCT id), COUNT_BIG(id)
FROM dbo.table02
GROUP BY db

либо что-то недопонял.
29 апр 16, 14:47    [19122175]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
Viiiiinni
Member

Откуда:
Сообщений: 5
AlanDenton
Что-то мне подсказывает запрос подойдет такой:
SELECT db, COUNT_BIG(DISTINCT id), COUNT_BIG(id)
FROM dbo.table02
GROUP BY db

либо что-то недопонял.

Нет, distinct не подойдет. Т.к. если id встречается 2 раза, то он не должен попасть в уникальные. В уникальные должны посчитаться id, которые встречаются только 1 раз
29 апр 16, 14:49    [19122183]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
AlanDenton
Что-то мне подсказывает запрос подойдет такой:
SELECT db, COUNT_BIG(DISTINCT id), COUNT_BIG(id)
FROM dbo.table02
GROUP BY db


либо что-то недопонял.


не совсем то, но всё равно у ТС наверчено что-то непонятное
29 апр 16, 14:50    [19122193]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
Viiiiinni
Member

Откуда:
Сообщений: 5
Konst_One
... as [not unik]

К сожалению, не помогло
Сообщение 130, уровень 15, состояние 1, строка 9
Cannot perform an aggregate function on an expression containing an aggregate or a subquery
29 апр 16, 14:51    [19122196]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
iljy
Member

Откуда:
Сообщений: 8711
Viiiiinni,

select db, sum(case c when 1 then 1 else 0 end) u, sum(case c when 1 then 0 else 1 end) nu
from t join (select id, count(*) c from t group  by id ) i on t.id = i.id
group by db
29 апр 16, 14:53    [19122211]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
select x.db, sum(case x.cnt when 1 then 1 end) unique, sum(case x.cnt when 1 then 0 else 1 end) non_unique
from  (
      select db, count(id) cnt
      from table02
      group by db, id
      ) x
group by x.db
29 апр 16, 14:58    [19122249]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
Viiiiinni
Member

Откуда:
Сообщений: 5
iljy
Viiiiinni,

select db, sum(case c when 1 then 1 else 0 end) u, sum(case c when 1 then 0 else 1 end) nu
from t join (select id, count(*) c from t group  by id ) i on t.id = i.id
group by db

Спасибо большое, но забыл дописать в условия, что должен быть один запрос, без джойнов и без подзапросов, только с одной групировкой по db.
Или это нереальное условие?
29 апр 16, 14:58    [19122252]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
Viiiiinni
только с одной групировкой по db.
Или это нереальное условие?

нереальное. Тебе нужны ДВА уровня группировки.
29 апр 16, 15:00    [19122266]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Viiiiinni,

select db, 
    count(distinct case when cnt = 1 then id else null end) unik,
    count(distinct case when cnt != 1 then id else null end) [not unik]
from
    (select db, id, count(*) over(partition by db, id) cnt
    from db.dbo.table02) a
group by db
29 апр 16, 15:00    [19122272]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
iljy
Member

Откуда:
Сообщений: 8711
Viiiiinni
iljy
Viiiiinni,

select db, sum(case c when 1 then 1 else 0 end) u, sum(case c when 1 then 0 else 1 end) nu
from t join (select id, count(*) c from t group  by id ) i on t.id = i.id
group by db

Спасибо большое, но забыл дописать в условия, что должен быть один запрос, без джойнов и без подзапросов, только с одной групировкой по db.
Или это нереальное условие?


А оконные функции можно использовать? Тогда как-то так

select db, sum...
from(
	select db, id, MAX(c) с
	from (
		select *, COUNT(*) over(partition by id) c
		from t
	)t
	group by db,id
)t
group by db
29 апр 16, 15:03    [19122293]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
iljy

А оконные функции можно использовать? Тогда как-то так

не плохо бы ТС было сразу указать версию сервера

select db, sum...
from(
	select db, id, MAX(c) с
	from (
		select *, COUNT(*) over(partition by id) c
		from t
	)t
	group by db,id
)t
group by db

похоже на cte :)
29 апр 16, 15:08    [19122345]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
iljy,

можно ли считать, что здесь нет подзапросов?
29 апр 16, 15:09    [19122348]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
iljy
Member

Откуда:
Сообщений: 8711
iap,

да черт его знает задача странная, какие подзапросы имелись ввиду - непонятно. от второй группировки можно избавиться в принципе, как WarAnt написал.
29 апр 16, 15:16    [19122389]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
Viiiiinni
Member

Откуда:
Сообщений: 5
Всем спасибо, подошел вариант от WarAnt

Извините за такое изложение условий, сам ели разобрался:)
29 апр 16, 15:27    [19122473]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
Viiiiinni
подошел вариант от WarAnt

Но там же две группировки. Просто одна неявная...
29 апр 16, 15:32    [19122510]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
iljy
Member

Откуда:
Сообщений: 8711
Viiiiinni,

а откуда такая задача вообще? Решение с COUNT OVER отнюдь не самое эффективное, не смотря на то, что "без подзапросов и джойнов и с одной группировкой".
29 апр 16, 15:47    [19122623]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
iljy
Viiiiinni,

а откуда такая задача вообще? Решение с COUNT OVER отнюдь не самое эффективное, не смотря на то, что "без подзапросов и джойнов и с одной группировкой".

собеседование поди :)
29 апр 16, 16:00    [19122713]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет уникальных/дублей через case  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4901
Viiiiinni,

Это?

SELECT 
	SUM(UNIQUE_ROWS) UNIQUE_ROWS, 
	SUM(NON_UNIQUE_ROWS) NON_UNIQUE_ROWS 
FROM 
(
	SELECT DISTINCT 
		db, 
		C,
		IIF(C = 1, 1, 0) UNIQUE_ROWS, 
		IIF(C > 1, 1, 0) NON_UNIQUE_ROWS 
	FROM 
	(
		SELECT db, id,
			C = COUNT(*) OVER (PARTITION BY db)
		FROM 
		(
			VALUES 
			(1, 1),
			(1, 2),
			(1, 3),
			(2, 1),
			(3, 1),
			(4, 1),
			(4, 2),
			(5, 1),
			(1, 4)
		) T(db, id)
	) T
) T
29 апр 16, 18:16    [19123306]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить