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

Откуда:
Сообщений: 499
Есть таблица
CREATE TABLE [doc_tbl] (
  [id] int IDENTITY(1, 1) NOT NULL,
  [doc_date] datetime NOT NULL,
  [doc_sum] decimal(15, 2) NOT NULL,
  [r_agent] int NOT NULL,
)
в которой находятся данные по расчетам с контрагентами
положительная сумма увеличение долга контрагента,
отрицательная-уменьшение.
Запрос
declare @dt datetime
set @dt='20090706'
select r_agent,max(p6) from 
(
	select
    	b.r_agent,    	
		case when max(DATEDIFF(day,case when sale_>pay then data.doc_date else @dt end,@dt))>0 then max(DATEDIFF(day,case when sale_>pay then data.doc_date else @dt end,@dt)) else 0 end as p6
	from 
    (
		select 
        	b.id,
            doc_date,
            b.r_agent,
            (select sum(b2.doc_sum) from doc_tbl b2  where b2.r_agent=b.r_agent and b2.doc_date<=b.doc_date and b2.doc_sum>0) sale_
		from doc_tbl b
		where doc_date<@dt and doc_sum>0
	) data
	right join 
    (
    	select
			b.r_agent,
    		sum(case when doc_sum<0 then doc_sum else 0 end) as pay
		from doc_tbl b
		group by b.r_agent
	) b on data.r_agent=b.r_agent 
	group by
    	b.pay,b.r_agent
) data
group by r_agent

выводит количество дней просрочки платежей по каждому контрагенту.
возможно ли его как-либо оптмизировать?
9 июл 09, 10:39    [7394918]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос  [new]
Troglodit
Member

Откуда:
Сообщений: 499
SQL Server 2005
9 июл 09, 10:39    [7394921]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос  [new]
йцу1
Guest
а хранимые процедуры запрещено использовать?
9 июл 09, 10:54    [7395064]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос  [new]
йцу1
Guest
да и вообще
как может человек писать такие запросы?? или их конструктор какой-нибудь сочиняет...
9 июл 09, 10:59    [7395088]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
йцу1
да и вообще
как может человек писать такие запросы??


Ууу... еще и не такие... ;)
9 июл 09, 11:10    [7395153]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос  [new]
йцу1
Guest
pkarklin
йцу1
да и вообще
как может человек писать такие запросы??


Ууу... еще и не такие... ;)


я к тому, что намного проще хранимку из нескольких шагов написать...
чем городить такое!
9 июл 09, 11:14    [7395176]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
йцу1
я к тому, что намного проще хранимку из нескольких шагов написать...
чем городить такое!


ой, не факт...
9 июл 09, 11:17    [7395180]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос  [new]
Troglodit
Member

Откуда:
Сообщений: 499
а при чем здесь ХП?Мне нужен скрипт, а где его использовать в триггере,хп, функции -это вопрос второй.
Я пробовал с временным таблицами, но учитывая, что размер таблицы около миллиона записей , выполнялось еще медленнее
ЗЫ. Если можно, то приветствуются только ответы по существу.
9 июл 09, 11:31    [7395313]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос  [new]
йцу1
Guest
Troglodit,
а почему в заджойненном селекте даты нету? так должно быть?
9 июл 09, 11:50    [7395503]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос  [new]
Troglodit
Member

Откуда:
Сообщений: 499
2 йцу1
Уважаемый постер, я был бы Вам очень признателен, если бы вы забыли этот топик, так как мало того, что вы создали 4 поста словесного бреда, вас еще что то не устраивает.
9 июл 09, 12:12    [7395663]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36808
Troglodit
2 йцу1
Уважаемый постер, я был бы Вам очень признателен, если бы вы забыли этот топик, так как мало того, что вы создали 4 поста словесного бреда, вас еще что то не устраивает.
Давайте без перехода на личности.
9 июл 09, 12:13    [7395670]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Troglodit
2 йцу1
Уважаемый постер, я был бы Вам очень признателен, если бы вы забыли этот топик, так как мало того, что вы создали 4 поста словесного бреда, вас еще что то не устраивает.


а помоему он задал вполне нормальный вопрос, и можно было просто сказать что там храняться все платежи клиента и расчитываетья остаток платежа на заданую дату.
9 июл 09, 12:19    [7395701]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос  [new]
Troglodit
Member

Откуда:
Сообщений: 499
2 Maxx
в моем первом же посте
"в которой находятся данные по расчетам с контрагентами" и ваше "все платежи клиента".
2 Гавриленко Сергей Алексеевич
Погорячился я, просто по-человечески попросил не засорять топик, человек не понял.
9 июл 09, 12:24    [7395741]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос  [new]
Michael_N
Member

Откуда: Белокуриха, АК
Сообщений: 150
Troglodit,

какие индексы на таблице?
Навскидку - вынести подзапросы во временные таблицы.
9 июл 09, 15:20    [7397391]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизировать запрос  [new]
йцу1
Guest
а я продолжу))

накалякал за пять минут
думаю логика ясна

@dt_2 = dateadd(day,-1,@dt)

insert into #exit
select
    r_agent,
    @dt
    sum(doc_sum) as sale
from
    doc_tbl b
where
    doc_date<=@dt_2 and
    doc_sum>0
group by r_agent

insert into #pay
select
    b.r_agent,
    sum(doc_sum) as pay
from doc_tbl b
where doc_sum<0
r_agent

update #exit
set pay = p.pay
from #pay p
where #exit.r_agent = p.r_agent

update #exit
set flag = 1
where pay >= sale

select @i = count(*) from #exit where flag = 0
while @i > 0
begin

    dateadd(day,-1,@dt_2)

    insert into #temp
    select
        r_agent,
        sum(doc_sum) as sale
    from
        #exit e,
        doc_tbl b
    where
        flag = 0 and b.r_agent = e.r_agent and
        b.doc_date=@dt_2 and
        b.doc_sum>0
    
    update #exit
    set sale = sale + t.sale
    from #temp t
    where flag = 0 and r_agent = t.r_agent
    
    update #exit
    set flag = 1, doc_date = @dt_2
    where pay >= sale and flag = 0
    
    delete from #temp
    

    select @i = count(*) from #exit where flag = 0
end

update #exit
set p6 = DATEDIFF(day,doc_date,@dt)

select r_agent,max(p6) from #exit
9 июл 09, 16:02    [7397742]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить