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

Откуда:
Сообщений: 81
Всем привет!

Есть две таблицы. Допустим Подразделение (PK, Наименование) и Палата (PK, ПодразделениеPK, Пациент, Вместимость).
Нужно составить запрос, который для каждого подразделения будет выводить количество различных пациентов в палатах вместимостью 1, 2, 3
Т.е. итоговая таблица должна иметь вид:

Подразделение | пациентов в одноместных палатах | пациентов в двухместных палатах | пациентов в трехместных палатах


Как это реализовать с использованием подзапросов я знаю. Но таблица не маленькая, да и условие в реальности далеко не такое простое, поэтому хочется, чтобы запрос работал побыстрее.
Помогите, плиз, у кого какие мысли на этот счет возникнут.

Заранее спасибо!
11 июл 13, 14:42    [14552693]     Ответить | Цитировать Сообщить модератору
 Re: Count\Sum (Distinct) с наложенным ограничением  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
SUM(CASE Вместимость WHEN 1 THEN 1 ELSE 0 END)
и т.п.
WHERE Вместимость IN(1,2,3)
11 июл 13, 14:47    [14552721]     Ответить | Цитировать Сообщить модератору
 Re: Count\Sum (Distinct) с наложенным ограничением  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
А вообще, для каждого пациента своя запись в палатах - это как-то неправильно.
Нужна таблица Пациенты со ссылкой на Палату.
11 июл 13, 14:51    [14552764]     Ответить | Цитировать Сообщить модератору
 Re: Count\Sum (Distinct) с наложенным ограничением  [new]
hertherherth
Guest
keeper89,

1 схема кривая
2 где данные, Зин?

with m as
(
	select *
	from (values
			(1, 1, 'Иванов', 2),
			(2, 1, 'Петров', 2),
			(3, 1, 'Сидоров', 1),
			(4, 2, 'Зозо', 1),
			(4, 3, 'Сосо', 1)
		) d(pk, dept, fullname, capacity)
)
select dept as [Подразделение], isnull([1], 0) as [1 местные], isnull([2], 0) as [2 местные], isnull([3], 0) as [3 местные]
from
	(
		select dept, capacity, count(1) as cnt
		from m
		group by dept, capacity
	) t1
	pivot (min(cnt) for capacity in([1], [2], [3])) q
11 июл 13, 14:58    [14552829]     Ответить | Цитировать Сообщить модератору
 Re: Count\Sum (Distinct) с наложенным ограничением  [new]
keeper89
Member

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

Согласен, схема кривая. Но это не схема из реальной задачи. Просто на скорую руку попытался прикинуть какую-нить схожую схему. Получилось не очень удачно.
Предложенный вариант с SUM(CASE Вместимость WHEN 1 THEN 1 ELSE 0 END) не подойдет мне из-за отличия в предметных областях.


Наверное надо было сразу из реальной предметной области приводить пример.
В общем, есть Подразделение и КурсРеабилитации (PK, ПодразделениеPK, Пациент, Стационар, Возраст)
Нужно так же для каждого подразделения вывести количество различных пациентов. Отдельно для круглосуточного и дневного стационара и внутри каждого стационара отдельно посчитать детей и взрослых (возраст < 18 или >=18)

Например, имеем:
Таблица Подразделение:
pk | Наименование
1 | Подразделение1
2 | Подразделение2
3 | Подразделение3


Таблица КурсРеабилитации :
pk | ПодразделениеPK | Пациент | Стационар | Возраст
1 | 1 | Иванов | Дневной | 10
2 | 1 | Иванов | Круглосуточный | 15
3 | 1 | Иванов | Круглосуточный | 16
4 | 1 | Петров | Круглосуточный | 17
5 | 1 | Сидоров | Круглосуточный | 35
6 | 2 | Петров | Дневной | 25
7 | 2 | Иванчук | Дневной | 25


Должны получить:
Подразделение | Дневной Дети | Дневной Взрослые | Круглосуточный Дети | Круглосуточный Взрослые
Подразделение1 | 1 | 0 | 2 | 1
Подразделение2 | 0 | 2 | 0 | 0
Подразделение3 | 0 | 0 | 0 | 0
11 июл 13, 15:37    [14553200]     Ответить | Цитировать Сообщить модератору
 Re: Count\Sum (Distinct) с наложенным ограничением  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
SUM(CASE WHEN Возраст<18 THEN 1 ELSE 0 END)
Не вижу принципиальных отличий.
11 июл 13, 15:41    [14553225]     Ответить | Цитировать Сообщить модератору
 Re: Count\Sum (Distinct) с наложенным ограничением  [new]
keeper89
Member

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

Пациенты могут быть одинаковыми (см 2 и 3 записи в примере). А задача посчитать количество разных пациентов.

p.s. по факту для пациентов отдельная таблица есть в базе, но для примера запроса точно не принципиально проверять уникальность фамилии или первичного ключа.
11 июл 13, 15:47    [14553282]     Ответить | Цитировать Сообщить модератору
 Re: Count\Sum (Distinct) с наложенным ограничением  [new]
iap
Member

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

Пациенты могут быть одинаковыми (см 2 и 3 записи в примере). А задача посчитать количество разных пациентов.

p.s. по факту для пациентов отдельная таблица есть в базе, но для примера запроса точно не принципиально проверять уникальность фамилии или первичного ключа.
Уффф...
SUM(DISTINCT CASE WHEN Возраст<18 THEN Пациент ELSE 0 END)
Так что ли?
11 июл 13, 15:54    [14553326]     Ответить | Цитировать Сообщить модератору
 Re: Count\Sum (Distinct) с наложенным ограничением  [new]
iap
Member

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

Пациенты могут быть одинаковыми (см 2 и 3 записи в примере). А задача посчитать количество разных пациентов.

p.s. по факту для пациентов отдельная таблица есть в базе, но для примера запроса точно не принципиально проверять уникальность фамилии или первичного ключа.
Уффф...
SUM(DISTINCT CASE WHEN Возраст<18 THEN Пациент ELSE 0 END)

Так что ли?
Не, не так:
SUM(DISTINCT SIGN(CASE WHEN Возраст<18 THEN ПациентID ELSE 0 END))
Или
COUNT(DISTINCT CASE WHEN Возраст<18 THEN Пациент ELSE 0 END)
Правда, если Пациент - строка, то возможны однофамильцы и даже полные однофамильцы...
11 июл 13, 15:57    [14553356]     Ответить | Цитировать Сообщить модератору
 Re: Count\Sum (Distinct) с наложенным ограничением  [new]
keeper89
Member

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

хмм... а так можно?!
Щас попробую
11 июл 13, 15:58    [14553358]     Ответить | Цитировать Сообщить модератору
 Re: Count\Sum (Distinct) с наложенным ограничением  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
точнее,
COUNT(DISTINCT CASE WHEN Возраст<18 THEN Пациент END)
11 июл 13, 16:17    [14553520]     Ответить | Цитировать Сообщить модератору
 Re: Count\Sum (Distinct) с наложенным ограничением  [new]
keeper89
Member

Откуда:
Сообщений: 81
Cygapb-007, iap,

Спасибо большое! Очень помогли!
11 июл 13, 16:27    [14553607]     Ответить | Цитировать Сообщить модератору
 Re: Count\Sum (Distinct) с наложенным ограничением  [new]
gwergwerg
Guest
keeper89,

оно?

with [Подразделение] as
(
	select *
	from (values
			(1, 'Подразделение 1'),
			(2, 'Подразделение 3'),
			(3, 'Подразделение 2')
		) d(pk, [Наименование])
),
[КурсРеабилитации] as
(
	select *
	from (values
			(1, 1, 'Иванов', 'Дневной', 10),
			(2, 1, 'Петров', 'Круглосуточный', 15),
			(3, 1, 'Иванов', 'Круглосуточный', 16),
			(4, 1, 'Петров', 'Круглосуточный', 17),
			(5, 1, 'Сидоров', 'Круглосуточный', 35),
			(6, 2, 'Петров', 'Дневной', 25),
			(7, 2, 'Иванчук', 'Дневной', 25)
		) d(pk, [ПодразделениеPK], [Пациент], [Стационар], [Возраст])
),
t2 as
(
	select *, case when [Возраст] < 18 then 'Д' else 'В' end as [ЭтоШколотота]
	from [КурсРеабилитации]
),
t3 as
(
	select *
	from
		(
			select [ПодразделениеPK], concat([Стационар], [ЭтоШколотота]) as [qqq], count(distinct [Пациент]) cnt
			from t2
			group by [ПодразделениеPK], [Стационар], [ЭтоШколотота]
		) q
		pivot (max(q.cnt) for [qqq] in ([ДневнойД], [ДневнойВ], [КруглосуточныйД], [КруглосуточныйВ])) AS QQQ
)
select [Наименование] as [Подразделение], [ДневнойД], [ДневнойВ], [КруглосуточныйД], [КруглосуточныйВ]
from
	[Подразделение] p
		left join
	t3 r on p.pk = r.ПодразделениеPK
11 июл 13, 16:42    [14553745]     Ответить | Цитировать Сообщить модератору
 Re: Count\Sum (Distinct) с наложенным ограничением  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Cygapb-007
точнее,
COUNT(DISTINCT CASE WHEN Возраст<18 THEN Пациент END)
Да. ошибся, сумму переписывая.
Теперь на NULL орать предупреждением будет!
11 июл 13, 16:45    [14553771]     Ответить | Цитировать Сообщить модератору
 Re: Count\Sum (Distinct) с наложенным ограничением  [new]
keeper89
Member

Откуда:
Сообщений: 81
Возникла еще одна похожая задача.
Нужно посчитать суммарный возраст различный пациентов.
Просто заменить Count на Sum не получится, т.к. если возраст двух разных пациентов будет одинаковым, то посчитается только один из пациентов.
Можно ли в этом случае так же обойтись без подзапросов?
Интуиция подсказывает мне, что тут уже без них не обойтись...
25 июл 13, 14:13    [14616276]     Ответить | Цитировать Сообщить модератору
 Re: Count\Sum (Distinct) с наложенным ограничением  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
keeper89
Возникла еще одна похожая задача.
Нужно посчитать суммарный возраст различный пациентов.
Просто заменить Count на Sum не получится, т.к. если возраст двух разных пациентов будет одинаковым, то посчитается только один из пациентов.
Можно ли в этом случае так же обойтись без подзапросов?
Интуиция подсказывает мне, что тут уже без них не обойтись...
Выложить здесь неправильно работающий запрос слабО?
И структуру таблиц (PK - обязательно).
25 июл 13, 14:29    [14616414]     Ответить | Цитировать Сообщить модератору
 Re: Count\Sum (Distinct) с наложенным ограничением  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
iap
keeper89
Возникла еще одна похожая задача.
Нужно посчитать суммарный возраст различный пациентов.
Просто заменить Count на Sum не получится, т.к. если возраст двух разных пациентов будет одинаковым, то посчитается только один из пациентов.
Можно ли в этом случае так же обойтись без подзапросов?
Интуиция подсказывает мне, что тут уже без них не обойтись...
Выложить здесь неправильно работающий запрос слабО?
И структуру таблиц (PK - обязательно).
Или структура та же, что и выше?
25 июл 13, 14:30    [14616420]     Ответить | Цитировать Сообщить модератору
 Re: Count\Sum (Distinct) с наложенным ограничением  [new]
Гость333
Member

Откуда:
Сообщений: 3683
keeper89
Нужно посчитать суммарный возраст различный пациентов.

Весело у вас.
"Суммарный возраст пациентов в палате №6 равен 117 годам".
Что дальше можно сделать с этой полезной информацией? :-)
25 июл 13, 14:48    [14616536]     Ответить | Цитировать Сообщить модератору
 Re: Count\Sum (Distinct) с наложенным ограничением  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2415
Гость333
Что дальше можно сделать с этой полезной информацией? :-)


разделить на среднюю температуру по палате ;)
25 июл 13, 15:16    [14616758]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить