Конференция "Базы" » Оптимизация SQL запроса к MsSQL [MsSQL]
 
  • DelphiN! © (10.06.17 14:40) [0]
    Доброго времени суток!
    Пожалуйста, помогите оптимизировать 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;
 
Конференция "Базы" » Оптимизация SQL запроса к MsSQL [MsSQL]
Есть новые Нет новых   [118686   +15][b:0][p:0.002]