-
Доброго времени суток! Пожалуйста, помогите оптимизировать 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]
Спасибо! Переделал следующим образом:
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
Но не могу придумать как отделаться от под запроса при определении количества старых клиентов. Может быть есть идеи?
-
считай не дистинкт клиентов по операциям а считай клиентов в клиентах по их экзисту в операциях
-
и убери наконец дурацкие касты из основного запроса
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;
|