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

Откуда:
Сообщений: 140
Здравствуйте.
Я использую для подсчета следующий SQL запрос

Declare @fromdate datetime
Declare @tilldate datetime
Declare @currdate datetime

set @fromdate='2005-01-01'
set @tilldate='2005-01-28'
set @currdate='2005-01-28'

Select doc_type, doc_types.uname, Count(in_docs.id) "All",
(Select Count(id)
from in_docs ind
where ind.Control = 1 and ind.doc_type=in_docs.doc_type and ind.create_date between @fromdate and @tilldate) "Control",
(Select Count(id)
from in_docs ind
where ind.Control = 0 and ind.doc_type=in_docs.doc_type and ind.create_date between @fromdate and @tilldate) "ControlOff",
(Select Count(id)
from in_docs ind
where ind.Control = 1 and ind.srok < @Currdate and ind.doc_type=in_docs.doc_type and ind.create_date between @fromdate and @tilldate) "Overdue"

from in_docs
left join doc_Types on (in_docs.doc_type=Doc_types.id)
where in_docs.create_date between @fromdate and @tilldate
group by doc_type, doc_types.uname

в результате которого получаю примерно такую картину

тип_документа all control controloff overdue
... 12 2 10 1

Все работает замечательно, но я думаю что такой запрос не оптимален, потому что количество вызовов оператора select = n*3, где n-количество типов документа, и каждый оператор Select производит поиск по всей таблице. Может есть какой нибудь другой способ такого подсчета ?
28 янв 05, 09:11    [1280728]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные операторы Select  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
примерно так
Select doc_type, doc_types.uname, Count(in_docs.id) "All",
sum(
 case 
  when control=1 and create_date between @fromdate and @tilldate then 1
  else 0
 end
) "Control",
...
from in_docs 
left join doc_Types on (in_docs.doc_type=Doc_types.id)
where in_docs.create_date between @fromdate and @tilldate
group by doc_type, doc_types.uname
28 янв 05, 09:24    [1280755]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные операторы Select  [new]
Han Yuriy
Member

Откуда:
Сообщений: 140
Спасибо :) Все работает намного быстрее. Да, и ещё я передаю текущую дату как параметр процедуры @currdate, потому что GetDate() возвращает DateTime т.е. '2005-01-28 13:09:00'. Для того чтобы посчитать все документы за сегодня нужно '2005-01-28'. Есть ли в TSQL аналог функции Delphi FormatDateTime ? Спасибо
28 янв 05, 11:42    [1281365]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные операторы Select  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Han Yuriy
Есть ли в TSQL аналог функции Delphi FormatDateTime ? Спасибо

Набор UDF для работы с круглыми датами (без временной составляющей)
28 янв 05, 11:45    [1281395]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить