Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Оптимизация SQL запроса к MsSQL [MsSQL]


DelphiN! ©   (10.06.17 14:40

Доброго времени суток!
Пожалуйста, помогите оптимизировать SQL запрос, выполняется очень долго ...


select distinct(cast(Time as date))"Дата",
(select count(Sum) from CashOperations where cast(Time as date) = cast(MAIN.Time as date) and Note = 'Получение')"Получено шт.",
(select sum(abs(Sum)) from CashOperations where cast(Time as date) = cast(MAIN.Time as date) and Note = 'Получение')"Получено тг.",
(select count(Sum) from CashOperations where cast(Time as date) = cast(MAIN.Time as date) and (Note = 'Гашение' or Note = 'Продление'))"Погашено и продлено шт.",
(select sum(abs(Sum)) from CashOperations where cast(Time as date) = cast(MAIN.Time as date) and (Note = 'Гашение' or Note = 'Продление'))"Погашено и продлено тг.",
(select sum(abs(Sum)) from CashOperations where cast(Time as date) = cast(MAIN.Time as date) and (Note = 'Продление'))"Из них продлено"

from CashOperations MAIN where Time > '2017-06-01 00:00:00' and Time < '2017-06-10 00:00:00'


Заранее благодарен за любую помощь!


rrrrrr ©   (10.06.17 17:52[1]

убери подзапросы и дистинкт
вместо этого сгруппируй по дате без времени и ноте


DelphiN! ©   (11.06.17 12:02[2]


> rrrrrr ©   (10.06.17 17:52) [1]


Спасибо! Переделал следующим образом:


select cast(Time as date) As Date,Note,Count(Sum) as Count,Sum(abs(Sum)) as Sum,


--Процент старых
Round((
--Старых клиентов
cast((select count(distinct(ClientID)) from CashOperations B2 where cast(Time as date) = cast(MAIN.Time as date) and Note = 'Получение' and
(select count(Sum) from CashOperations where cast(Time as date) < cast(B2.Time as date) and ClientID = B2.ClientID and Note = 'Гашение')>0) as float)
/
--Всего клиентов
cast((select count(distinct(ClientID)) from CashOperations where cast(Time as date) = cast(MAIN.Time as date) and Note = 'Получение') as float)  
*
100),2) as OldsPercent


from CashOperations MAIN

where Time > '2017-06-01 00:00:00' and Time < '2017-06-11 00:00:00'

group by cast(Time as date),Note
order by 1


Но не могу придумать как отделаться от под запроса при определении количества старых клиентов. Может быть есть идеи?


rrrrrr ©   (11.06.17 12:38[3]

считай не дистинкт клиентов по операциям
а считай клиентов в клиентах по их экзисту в операциях


rrrrrr ©   (11.06.17 13:03[4]

и убери наконец дурацкие касты из основного запроса

declare @p_wanted_date varchar(20) = '2017-06-11';
declare @date_in datetime, @date_out datetime;
set @date_in  = CONVERT(datetime, @p_wanted_date, 120);
set @date_out = dateadd(second,-1,dateadd(day, 1,CONVERT(datetime, @p_wanted_date, 120)));

...

select *
from ....
where something between @date_in and @date_out;


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо