Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 оптимизация запроса (несколько запрос в один)  [new]
Habib Karimov
Member

Откуда: Москва
Сообщений: 67
Всем доброго времени суток
имею следующие запросы:
Запрос 1
SELECT so.ClientID, 'All Channels' as CustomerGroup, so.StatementID, so.Brand, so.Product,
Sum(so.Amount) Amount, Sum(so.Value_CP) Value_CP
into #t1
FROM RG_SalesOut_Report so
WHERE so.Block=0 AND so.[All Sources]='SalesOUT'
GROUP BY so.ClientID, so.CustomerGroup, so.StatementID, so.Brand, so.Product
HAVING Sum(so.Value_CP)>0 AND Sum(so.Amount)>0 AND
so.Brand in('Brand1', 'Brand2')

Запрос 2

select t1.ClientID, t1.CustomerGroup, t1.StatementID, t1.Brand, t1.Product,
Sum(t1.Amount) AS Amount, Sum(t1.Value_CP) AS Value_CP
into #t2
from #t1 t1
group by t1.ClientID, t1.CustomerGroup, t1.StatementID, t1.Brand, t1.Product

Запрос 3

select ROW_NUMBER() over(order by t2.ClientID desc) as ID, *, CONCAT(t2.ClientID, t2.Product) AS Code
into #t3
from #t2 t2
group by t2.ClientID, t2.CustomerGroup, t2.StatementID, t2.Brand, t2.Product, t2.Amount, t2.Value_CP, CONCAT(t2.ClientID, t2.Product)
ORDER BY t2.ClientID DESC, t2.Product, t2.StatementID desc

Запрос 4

select tab1.ID, tab2.ID as ID_2, tab1.ClientID, tab2.ClientID as cl_ID2, tab1.CustomerGroup, tab1.StatementID, tab1.Brand,
tab1.Product, tab1.Amount, tab1.Value_CP, IIF(tab1.code=tab2.code, DATEDIFF(MONTH,tab2.StatementID, tab1.StatementID), 0) AS M_SALES
FROM #t3 tab1
RIGHT JOIN #t3 tab2
ON tab1.ID=tab2.ID-1
where tab1.StatementID>='2013-01-01'
order by tab1.ID asc


работает хорошо, но запускаю 4 раза, чтобы получить желаемый результат

можно ли написать 1 сложный запрос и запустить 1 раз?
спасибо за потраченное драгоценное время
16 июн 14, 11:19    [16168218]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Habib Karimov
чтобы получить желаемый результат

Т.е. надо угадать, какой результат является желаемым ?
16 июн 14, 11:20    [16168227]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Добрый Э - Эх
Guest
Glory,

ну там же видно, что человек последовательно елозит по одним и тем же данным, вставляя результат каждого шага в табличку и обрабатывая его на последующем шаге...
16 июн 14, 11:26    [16168273]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Добрый Э - Эх
Guest
Habib Karimov,

а ты бы лучше привел юзабильный тестовый набор данных, на словах рассказал, что есть на входе и что хочешь получить на выходе, описав алгоритм преобразования данных. глядишь, и помощь бы кто оказал...
16 июн 14, 11:29    [16168294]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Habib Karimov
можно ли написать 1 сложный запрос и запустить 1 раз?
спасибо за потраченное драгоценное время

похоже что врядле (НО хорошо помудохавшись можно) ..НО есть пара замечаний
1. #tab1 сначала создается , а в запросе 4 - по ней фильтр
2. Далее сам запрос 4..вообще так сказать
tab1.ID = tab2.ID-1 где ROW_NUMBER() over(order by t2.ClientID desc) as ID
+ oder by tab1.ID asc

Что вообще выглядт довольно странно
НО вообщем и целом можно,базовых таблиц то всего 1 .
16 июн 14, 11:30    [16168300]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Добрый Э - Эх
ну там же видно, что человек последовательно елозит по одним и тем же данным, вставляя результат каждого шага в табличку и обрабатывая его на последующем шаге...

Там видно выбранный ТС-ом способ решения неизвестной задачи.
16 июн 14, 11:30    [16168302]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Habib Karimov
Member

Откуда: Москва
Сообщений: 67
Glory, спасибо за участие
нет, сначала запускаю 1 запрос, чтобы собирать информации из табл. "RG_SalesOut_Report" по определенным требованиям,

Запрос 2 - агрегирует колонки "Amount" $ "Value_CP", т.е. у нас есть клиенты, которые покупают от нас 1 товар, но имеют разные каналы продаж, для детального анализа мы разделили этих клиентов по каналам (например, клиент 1 покупал от нас товар 1, 2 уп. по разным каналам (ритейл и стейт))

Запрос 3 - добавляет столбец ID & Code

Запрос 4 - Добавляет столбец M_Sales, т.е. определяет новых и старых клиентов
16 июн 14, 11:31    [16168308]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Добрый Э - Эх
Guest
Habib Karimov
Всем доброго времени суток
имею следующие запросы:
Запрос 1
SELECT so.ClientID, 'All Channels' as CustomerGroup, so.StatementID, so.Brand, so.Product,
Sum(so.Amount) Amount, Sum(so.Value_CP) Value_CP
into #t1
FROM RG_SalesOut_Report so
WHERE so.Block=0 AND so.[All Sources]='SalesOUT'
GROUP BY so.ClientID, so.CustomerGroup, so.StatementID, so.Brand, so.Product
HAVING Sum(so.Value_CP)>0 AND Sum(so.Amount)>0 
 AND so.Brand in('Brand1', 'Brand2')

Как минимум перенести выделенное из секции HAVING в секцию WHERE.


Если версия сервера позволяет, почитать про LEAD/LAG и полностью избавиться от запроса, а заодно и от запроса 3...
16 июн 14, 11:39    [16168338]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх
Habib Karimov
Всем доброго времени суток
имею следующие запросы:
Запрос 1
SELECT so.ClientID, 'All Channels' as CustomerGroup, so.StatementID, so.Brand, so.Product,
Sum(so.Amount) Amount, Sum(so.Value_CP) Value_CP
into #t1
FROM RG_SalesOut_Report so
WHERE so.Block=0 AND so.[All Sources]='SalesOUT'
GROUP BY so.ClientID, so.CustomerGroup, so.StatementID, so.Brand, so.Product
HAVING Sum(so.Value_CP)>0 AND Sum(so.Amount)>0 
 AND so.Brand in('Brand1', 'Brand2')

Как минимум перенести выделенное из секции HAVING в секцию WHERE.


Если версия сервера позволяет, почитать про LEAD/LAG и полностью избавиться от запроса 4, а заодно и от запроса 3...
16 июн 14, 11:39    [16168342]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Добрый Э - Эх
LEAD/LAG

позволяет исходя из етого
Habib Karimov
IIF(tab1.code=tab2.code
16 июн 14, 11:43    [16168363]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Habib Karimov
Member

Откуда: Москва
Сообщений: 67
Всем еще раз доброго времени суток

перенес с HAVING на WHERE
получилось:
Запрос 1
SELECT so.ClientID, 'All Channels' as CustomerGroup, so.StatementID, so.Brand, so.Product,
Sum(so.Amount) Amount, Sum(so.Value_CP) Value_CP
into #t1
FROM RG_SalesOut_Report so
WHERE so.Block=0 AND so.[All Sources]='SalesOUT' AND so.Value_CP>0 AND so.Amount>0 AND so.Brand in('Brand1', 'Brand2')
GROUP BY so.ClientID, so.CustomerGroup, so.StatementID, so.Brand, so.Product

Запрос 2

select t1.ClientID, t1.CustomerGroup, t1.StatementID, t1.Brand, t1.Product,
Sum(t1.Amount) AS Amount, Sum(t1.Value_CP) AS Value_CP
into #t2
from #t1 t1
group by t1.ClientID, t1.CustomerGroup, t1.StatementID, t1.Brand, t1.Product

Запрос 3

select ROW_NUMBER() over(order by t2.ClientID desc) as ID, *, CONCAT(t2.ClientID, t2.Product) AS Code
into #t3
from #t2 t2
group by t2.ClientID, t2.CustomerGroup, t2.StatementID, t2.Brand, t2.Product, t2.Amount, t2.Value_CP, CONCAT(t2.ClientID, t2.Product)
ORDER BY t2.ClientID DESC, t2.Product, t2.StatementID desc

Запрос 4

select tab1.ID, tab2.ID as ID_2, tab1.ClientID, tab2.ClientID as cl_ID2, tab1.CustomerGroup, tab1.StatementID, tab1.Brand,
tab1.Product, tab1.Amount, tab1.Value_CP, IIF(tab1.code=tab2.code, DATEDIFF(MONTH,tab2.StatementID, tab1.StatementID), 0) AS M_SALES
FROM #t3 tab1
RIGHT JOIN #t3 tab2
ON tab1.ID=tab2.ID-1
where tab1.StatementID>='2013-01-01'
order by tab1.ID asc

возможно ли написать какой-нибудь запрос, чтобы они запустились автоматически по очереди с 1-го по 4?
(при запуске данного запроса)
Спасибо за потраченное драгоценное время
16 июн 14, 16:36    [16170681]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
запрос 1 и 2 запросто можно обьединить в 1 ,кстате
вам нужен ведь рузультат только запроса 4 как я понимаю ?
16 июн 14, 16:42    [16170714]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Habib Karimov
Member

Откуда: Москва
Сообщений: 67
Maxx, спасибо за потраченное драгоценное время

да, мне нужен результат только запроса 4
не могли бы направить мне на правильный путь?
спасибо
16 июн 14, 16:46    [16170740]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Habib Karimov
Member

Откуда: Москва
Сообщений: 67
Maxx,
как нам известно, в sql server-е одновременно не можем одновременно агрегировать и concat
спасибо
16 июн 14, 16:48    [16170754]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Habib Karimov
как нам известно, в sql server-е одновременно не можем одновременно агрегировать и concat

нет под рукой 12 , но
declare @t table (i int, c int, x nvarchar(20))
insert into @t(i,c,x)
select 1,1,'c'
union all
select 2,2,'a'
select
  SUm (i), cast(i as nvarchar(20)) + x
from @t
group by c,cast(i as nvarchar(20)) + x
16 июн 14, 17:06    [16170900]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Добрый Э - Эх
Guest
Habib Karimov
Maxx,
как нам известно, в sql server-е одновременно не можем одновременно агрегировать и concat
спасибо
Это кто сказал? И даже ссылку на документацию можешь привести с описанием такого чудесного поведения?
А то практические опыты говорят совсем о другом...


З.Ы.
А за упрощение тебе уже сказали: "запрос 3" + "запрос 4" заменяется посредством оконных функций LEAD/LAG в запросе 2, который сам по себе тоже не нужен, поэтому все легко поднимается до уровня ровно одного запроса - "запроса 1". Все манипуляции по конкатенации и получении "старого" значения на уровне первого запроса и делаешь...
17 июн 14, 06:04    [16173046]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Добрый Э - Эх
Guest
Maxx
нет под рукой 12
Если под рукой есть интернет, то и SQL Server 2012 всегда доступен на он-лайн ресурсе Sqlfiddle.com:
:)
17 июн 14, 06:06    [16173047]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Habib Karimov
Member

Откуда: Москва
Сообщений: 67
Добрый Э - Эх, спасибо за потраченное драгоценное время
хорошо, сегодня попробую, посмотрим что получится от этого
17 июн 14, 07:30    [16173096]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
Habib Karimov,

habib вы из баку новерное
???

используй
 union all 
пожалуйста

но надо тебя обратит внимания число столбца резултат каждому запроса
17 июн 14, 09:41    [16173528]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Добрый Э - Эх
Guest
yaxta
используй
 union all 
пожалуйста
И чем ему поможет union all, если он НЕ объединяет результаты запросов, а на каждом последующем этапе обрабатывает результат предыдущего этапа? То есть идет последовательное "допиливание" данных до нужного вида...
17 июн 14, 10:24    [16173839]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Merdoc
Member

Откуда: Новосибирск
Сообщений: 103
Habib Karimov,
Попробуйте такой

with t3 as 
(
select t2.*, ROW_NUMBER() over(order by t2.ClientID desc) as ID, *, CONCAT(t2.ClientID, t2.Product) AS Code
from 
(
SELECT so.ClientID, 'All Channels' as CustomerGroup, so.StatementID, so.Brand, so.Product,
Sum(so.Amount) Amount, Sum(so.Value_CP) Value_CP
into #t1
FROM RG_SalesOut_Report so
WHERE so.Block=0 AND so.[All Sources]='SalesOUT' and so.Brand in('Brand1', 'Brand2')
GROUP BY so.ClientID, so.CustomerGroup, so.StatementID, so.Brand, so.Product
HAVING Sum(so.Value_CP)>0 AND Sum(so.Amount)>0 
) t2
ORDER BY t2.ClientID DESC, t2.Product, t2.StatementID desc
)
select tab1.ID, tab2.ID as ID_2, tab1.ClientID, tab2.ClientID as cl_ID2, tab1.CustomerGroup, tab1.StatementID, tab1.Brand,
tab1.Product, tab1.Amount, tab1.Value_CP, IIF(tab1.code=tab2.code, DATEDIFF(MONTH,tab2.StatementID, tab1.StatementID), 0) AS M_SALES
FROM t3 tab1
RIGHT JOIN t3 tab2
ON tab1.ID=tab2.ID-1
where tab1.StatementID>='2013-01-01'
order by tab1.ID asc
17 июн 14, 10:32    [16173910]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Добрый Э - Эх
Guest
Merdoc,

у человека - 2012 скуль-сервер. зачем ты ему показываешь как получить предыдущую запись через row_number + self join? почему не покажешь более гуманный вариант на LEAD/LAG?
17 июн 14, 11:30    [16174417]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Merdoc
Member

Откуда: Новосибирск
Сообщений: 103
Добрый Э - Эх,
Это он точно осилит )
17 июн 14, 11:34    [16174456]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Habib Karimov
Member

Откуда: Москва
Сообщений: 67
yaxta, спасибо за участие
нет, я не из Баку
к сожалению, union all не поможет
17 июн 14, 13:13    [16175429]     Ответить | Цитировать Сообщить модератору
 Re: оптимизация запроса (несколько запрос в один)  [new]
Habib Karimov
Member

Откуда: Москва
Сообщений: 67
Merdoc
Habib Karimov,
Попробуйте такой

with t3 as 
(
select t2.*, ROW_NUMBER() over(order by t2.ClientID desc) as ID, *, CONCAT(t2.ClientID, t2.Product) AS Code
from 
(
SELECT so.ClientID, 'All Channels' as CustomerGroup, so.StatementID, so.Brand, so.Product,
Sum(so.Amount) Amount, Sum(so.Value_CP) Value_CP
into #t1
FROM RG_SalesOut_Report so
WHERE so.Block=0 AND so.[All Sources]='SalesOUT' and so.Brand in('Brand1', 'Brand2')
GROUP BY so.ClientID, so.CustomerGroup, so.StatementID, so.Brand, so.Product
HAVING Sum(so.Value_CP)>0 AND Sum(so.Amount)>0 
) t2
ORDER BY t2.ClientID DESC, t2.Product, t2.StatementID desc
)
select tab1.ID, tab2.ID as ID_2, tab1.ClientID, tab2.ClientID as cl_ID2, tab1.CustomerGroup, tab1.StatementID, tab1.Brand,
tab1.Product, tab1.Amount, tab1.Value_CP, IIF(tab1.code=tab2.code, DATEDIFF(MONTH,tab2.StatementID, tab1.StatementID), 0) AS M_SALES
FROM t3 tab1
RIGHT JOIN t3 tab2
ON tab1.ID=tab2.ID-1
where tab1.StatementID>='2013-01-01'
order by tab1.ID asc


использую ваш код, но там ошибка, сначала ругался на into #t1 - зачем нам здесь into?
удалил into #t1
но ругается на order by
ошибка
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.

спасибо за потраченное драгоценное время
17 июн 14, 13:21    [16175487]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить