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

Откуда:
Сообщений: 13
Результатом запроса должно быть единственное число - количество строк, полученных запросом, но в запросе использован GROUP BY поэтому COUNT работает как агрегатная функция. Можно ли каким нибудь всё таки получить реальное количество строк в этом случае?
6 дек 13, 09:12    [15250638]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
DmitryVT
Member

Откуда: VRN
Сообщений: 192
запрос свой покажите.
6 дек 13, 09:14    [15250646]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
PSdude
Member

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

SELECT Card.PatientID_Ref
FROM RegisterPolyclinicRow,
	Card
WHERE (RegisterPolyclinicRow.RegisterDocID_Ref = 2081) and
	(RegisterPolyclinicRow.CardID_Ref = Card.CardID) and
	(Card.VisitReasonID_Ref=12) and
	(Card.CardEndDate BETWEEN '26-07-2013' AND '25-08-2013')

group by Card.PatientID_Ref
6 дек 13, 09:25    [15250693]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
PSdude
Результатом запроса должно быть единственное число - количество строк, полученных запросом
Ну, заверните его в SELECT с COUNT-ом...
6 дек 13, 09:31    [15250711]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
PSdude
Member

Откуда:
Сообщений: 13
baracs,
автор
Ну, заверните его в SELECT с COUNT-ом...

Можете пример накидать? А то сам я пробовал - ошибку выдаёт, а как правильно в такой ситуации оформлять ни разу не видел.
6 дек 13, 09:35    [15250732]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
DmitryVT
Member

Откуда: VRN
Сообщений: 192
SELECT COUNT(A.PatientID_Ref) FROM
(SELECT C.PatientID_Ref
 FROM RegisterPolyclinicRow as RP inner join Card as C  
                                  ON RP.CardID_Ref = C.CardID	
 WHERE (RP.RegisterDocID_Ref = 2081) and
  	  (C.VisitReasonID_Ref=12) and
 	  (C.CardEndDate BETWEEN '26-07-2013' AND '25-08-2013')
 group by Card.PatientID_Ref)A
6 дек 13, 09:40    [15250760]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
DmitryVT
Member

Откуда: VRN
Сообщений: 192
SELECT COUNT(A.PatientID_Ref) FROM
(SELECT C.PatientID_Ref
 FROM RegisterPolyclinicRow as RP inner join Card as C  
                                  ON RP.CardID_Ref = C.CardID	
 WHERE (RP.RegisterDocID_Ref = 2081) and
  	  (C.VisitReasonID_Ref=12) and
 	  (C.CardEndDate BETWEEN '26-07-2013' AND '25-08-2013')
 group by C.PatientID_Ref)A


сори о печатался с группмровкой
6 дек 13, 09:42    [15250773]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
DmitryVT
SELECT COUNT(A.PatientID_Ref) FROM
(SELECT C.PatientID_Ref
 FROM RegisterPolyclinicRow as RP inner join Card as C  
                                  ON RP.CardID_Ref = C.CardID	
 WHERE (RP.RegisterDocID_Ref = 2081) and
  	  (C.VisitReasonID_Ref=12) and
 	  (C.CardEndDate BETWEEN '26-07-2013' AND '25-08-2013')
 group by C.PatientID_Ref)A


сори о печатался с группмровкой
А если присутствуют PatientID_Ref IS NULL?
6 дек 13, 09:51    [15250847]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
aleks2
Guest
SELECT Card.PatientID_Ref, count(*) over(partition by '')
FROM RegisterPolyclinicRow,
	Card
WHERE (RegisterPolyclinicRow.RegisterDocID_Ref = 2081) and
	(RegisterPolyclinicRow.CardID_Ref = Card.CardID) and
	(Card.VisitReasonID_Ref=12) and
	(Card.CardEndDate BETWEEN '26-07-2013' AND '25-08-2013')

group by Card.PatientID_Ref
6 дек 13, 09:54    [15250865]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
DmitryVT
Member

Откуда: VRN
Сообщений: 192
Значит учесть этот факт в условии подзапроса
6 дек 13, 09:54    [15250869]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
Добрый Э - Эх
Guest
aleks2
SELECT Card.PatientID_Ref, count(*) over(partition by '')
FROM RegisterPolyclinicRow,
	Card
WHERE (RegisterPolyclinicRow.RegisterDocID_Ref = 2081) and
	(RegisterPolyclinicRow.CardID_Ref = Card.CardID) and
	(Card.VisitReasonID_Ref=12) and
	(Card.CardEndDate BETWEEN '26-07-2013' AND '25-08-2013')

group by Card.PatientID_Ref
как минимум, для удовлетворения требования ТС нужно выкинуть Card.PatientID_Ref из селект-листа и добавить модификатор DISTINCT
6 дек 13, 09:57    [15250885]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
pio777
Member

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

Я подозреваю, что сначала будет выполнятся ваш запрос, а далее вам еще нужно получить количество строк, которое он вернул.
Если я прав, то можно так:

SELECT Card.PatientID_Ref
FROM RegisterPolyclinicRow,
	Card
WHERE (RegisterPolyclinicRow.RegisterDocID_Ref = 2081) and
	(RegisterPolyclinicRow.CardID_Ref = Card.CardID) and
	(Card.VisitReasonID_Ref=12) and
	(Card.CardEndDate BETWEEN '26-07-2013' AND '25-08-2013')

group by Card.PatientID_Ref

SELECT @@ROWCOUNT
6 дек 13, 09:57    [15250887]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
PSdude
Member

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

Спасибо большое! работает :)
6 дек 13, 09:58    [15250898]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх
aleks2
SELECT Card.PatientID_Ref, count(*) over(partition by '')
FROM RegisterPolyclinicRow,
	Card
WHERE (RegisterPolyclinicRow.RegisterDocID_Ref = 2081) and
	(RegisterPolyclinicRow.CardID_Ref = Card.CardID) and
	(Card.VisitReasonID_Ref=12) and
	(Card.CardEndDate BETWEEN '26-07-2013' AND '25-08-2013')

group by Card.PatientID_Ref
как минимум, для удовлетворения требования ТС нужно выкинуть Card.PatientID_Ref из селект-листа и добавить модификатор DISTINCT
Вот только в этом случае встает вопрос о целесообразности группировки и последующего наложения аналитики. Ведь можно сделать просто запрос без group by , но с count(distinct Card.PatientID_Ref) в селект-листе
6 дек 13, 09:59    [15250905]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
Добрый Э - Эх
Guest
PSdude
DmitryVT,

Спасибо большое! работает :)
а нахрена зачем делать лишние телодвижения, если того же эффукта можно достигнуть банальным:

SELECT count(distinct Card.PatientID_Ref) as cnt
FROM RegisterPolyclinicRow,
	Card
WHERE (RegisterPolyclinicRow.RegisterDocID_Ref = 2081) and
	(RegisterPolyclinicRow.CardID_Ref = Card.CardID) and
	(Card.VisitReasonID_Ref=12) and
	(Card.CardEndDate BETWEEN '26-07-2013' AND '25-08-2013')
???
6 дек 13, 10:01    [15250922]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
aleks2
Guest
Добрый Э - Эх
PSdude
DmitryVT,

Спасибо большое! работает :)
а нахрена зачем делать лишние телодвижения, если того же эффукта можно достигнуть банальным:

SELECT count(distinct Card.PatientID_Ref) as cnt
FROM RegisterPolyclinicRow,
	Card
WHERE (RegisterPolyclinicRow.RegisterDocID_Ref = 2081) and
	(RegisterPolyclinicRow.CardID_Ref = Card.CardID) and
	(Card.VisitReasonID_Ref=12) and
	(Card.CardEndDate BETWEEN '26-07-2013' AND '25-08-2013')
???


Так слишком просто.
6 дек 13, 10:03    [15250936]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
PSdude
Member

Откуда:
Сообщений: 13
Добрый Э - Эх,
а зачем делать лишние телодвижения, если того же эффукта можно достигнуть банальным:

SELECT count(distinct Card.PatientID_Ref) as cnt
FROM RegisterPolyclinicRow,
Card
WHERE (RegisterPolyclinicRow.RegisterDocID_Ref = 2081) and
(RegisterPolyclinicRow.CardID_Ref = Card.CardID) and
(Card.VisitReasonID_Ref=12) and
(Card.CardEndDate BETWEEN '26-07-2013' AND '25-08-2013')
???

Да выборка к производительности не критичная - раз в месяц работать будет, так что особо без разницы

Всем спасибо за варианты)
6 дек 13, 10:06    [15250949]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
DmitryVT
Member

Откуда: VRN
Сообщений: 192
Добрый Э - Эх

полностью согласен с DISTINCT значительно проще, а самое главное разумнее нежели группировку, но я хз что тс хочет от своего запроса, несмотря на то что
SELECT count(distinct Card.PatientID_Ref) as cnt
FROM RegisterPolyclinicRow,
	Card
WHERE (RegisterPolyclinicRow.RegisterDocID_Ref = 2081) and
	(RegisterPolyclinicRow.CardID_Ref = Card.CardID) and
	(Card.VisitReasonID_Ref=12) and
	(Card.CardEndDate BETWEEN '26-07-2013' AND '25-08-2013')

вернет тоже самое
6 дек 13, 10:06    [15250952]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
DmitryVT
Значит учесть этот факт в условии подзапроса
А если эти значения все-таки нужны?
6 дек 13, 10:06    [15250957]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
PSdude
DmitryVT,

Спасибо большое! работает :)
Автор, надеюсь, вы понимаете, что в вариантах 15250773 и 15250922 теряются NULL-ы?

Чтобы посчитать все строки, надо использовать COUNT(*).
6 дек 13, 10:36    [15251202]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Может, я педант, но разве 26-й месяц бывает?
baracs
Чтобы посчитать все строки, надо использовать COUNT(*).
Тогда невозможен COUNT(DISTINCT)
Однако, можно написать
COUNT(DISTINCT ISNULL(Card.PatientID_Ref,0))
Если Card.PatientID_Ref никогда не принимает значение 0, конечно
6 дек 13, 14:11    [15253058]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
iap
Может, я педант, но разве 26-й месяц бывает?
Это намек на то, что не может быть медицинской карты без пациента?
А я не удивлюсь, если бывает.
iap
baracs
Чтобы посчитать все строки, надо использовать COUNT(*).
Тогда невозможен COUNT(DISTINCT)
Заметьте, не я это предложил! (с)
6 дек 13, 14:56    [15253476]     Ответить | Цитировать Сообщить модератору
 Re: Как получить количество строк запроса, если используется группировка?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
baracs
iap
Может, я педант, но разве 26-й месяц бывает?
Это намек на то, что не может быть медицинской карты без пациента?
А я не удивлюсь, если бывает.
Нет. Это намёк на ужасный строковый формат даты в запросах ТС
6 дек 13, 15:11    [15253638]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить