|
v7: СКЛ-запрос. Получение максимальной и средневзвешенной цен. Нужна отимизация | ☑ | ||
---|---|---|---|---|
0
palpetrovich
21.10.16
✎
13:54
|
Кусок из запроса в хранимой процедуре СКЛ. @ТаблицаРезультат - результат пердыдущей работы запроса, большая...
Очень хочется в последнем условии и, наверное главное,в расчете "СрВзвЦена" брать данные не из @ТаблицаРезультат, а из результата вложенного запроса, это возможно? SELECT ТТ.Товар ,ТТ.Партия ,ТТ.МаксЦена ,(SELECT sum(Т2.МаксЦена*Т2.КвоПартии)/sum(Т2.КвоПартии) FROM @ТаблицаРезультат AS Т2 where Т2.Товар = ТТ.Товар) СрВзвЦена FROM( SELECT Т.Товар ,Т.МаксЦена ,Т.Партия ,Т.ИдСтроки FROM @ТаблицаРезультат Т where Т.МаксЦена =(SELECT Max(Т1.МаксЦена) FROM @ТаблицаРезультат AS Т1 where ТТ.Товар = Т1.Товар) ) ТТ where ТТ.ИдСтроки =(SELECT Max(Т2.ИдСтроки) FROM @ТаблицаРезультат AS Т2 where ТТ.Товар = Т2.Товар and ТТ.МаксЦена = Т2.МаксЦена) |
|||
1
Это_mike
21.10.16
✎
13:54
|
а кто может запретить?
|
|||
2
palpetrovich
21.10.16
✎
13:56
|
(1) не получается :(
подскажи как пожалуйста |
|||
3
palpetrovich
21.10.16
✎
14:02
|
+(2) пробовал так
( (insert into @Таб_тмп SELECT Т.Товар ,Т.МаксЦена ,Т.КвоПартии ,Т.Партия ,Т.ИдСтроки FROM @ТаблицаРезультат Т where Т.МаксЦена =(SELECT Max(Т0.МаксЦена) FROM @ТаблицаРезультат AS Т1 where Т.Товар = Т1.Товар) ) SELECT Товар ,МаксЦенаВходГрн ,КвоПартии ,Партия ,ИдСтроки FROM @Таб_тмп ) ТТ но это из области фантастики наверное |
|||
4
palpetrovich
21.10.16
✎
14:03
|
*
where Т.МаксЦена =(SELECT Max(Т1.МаксЦена) FROM @ТаблицаРезультат AS Т1 where Т.Товар = Т1.Товар) ошибка копи-пасте :) |
|||
5
palpetrovich
21.10.16
✎
14:14
|
Майк ушел, по-ходу ловить нечего :)
|
|||
6
youalex
21.10.16
✎
14:23
|
(0) используй CTE
|
|||
7
palpetrovich
21.10.16
✎
15:04
|
(6) спасибо за позсказку, но или я их не умею готовить или в данном случае - не вариант
SELECT ТТ.Товар ,ТТ.МаксЦенаВходГрн ,(SELECT sum(Т3.МаксЦенаВходГрн*Т3.КвоПартии) / sum(Т3.КвоПартии) FROM #ТаблицаРезультат AS Т3 where Т3.Товар = ТТ.Товар) СрЦена ,ТТ.ИдСтроки FROM ( WITH СТЕ (Товар,МаксЦенаВходГрн,ИдСтроки) AS ( SELECT Т.Товар ,Т.МаксЦенаВходГрн ,Т.ИдСтроки FROM #ТаблицаРезультат Т where Т.МаксЦенаВходГрн =(SELECT Max(Т1.МаксЦенаВходГрн) FROM #ТаблицаРезультат AS Т1 where Т.Товар = Т1.Товар) ) SELECT С.Товар ,С.МаксЦенаВходГрн ,С.ИдСтроки FROM СТЕ AS С ) ТТ where ТТ.ИдСтроки =(SELECT Max(Т2.ИдСтроки) FROM #ТаблицаРезультат AS Т2 where ТТ.Товар = Т2.Товар and ТТ.МаксЦенаВходГрн = Т2.МаксЦенаВходГрн) -- Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon. |
|||
8
Djelf
21.10.16
✎
21:26
|
(7) СТЕ как раз очень приемлемо. А вот готовить действительно не умеешь (cte находятся перед селектом из них): https://msdn.microsoft.com/ru-ru/library/ms175972.aspx?f=255&MSPPError=-2147217396
|
|||
9
palpetrovich
22.10.16
✎
15:00
|
(8) по ссылке - "Не удаётся завершить защищённую транзакцию"
"cte находятся перед селектом из них" - тут явно что-то пропущено :) |
|||
10
youalex
22.10.16
✎
15:20
|
(9) можешь рассматривать cte как аналог временной таблицы, но в отличие от вт - cte живет только одну операцию после создания.
Простейший пример: ;WITH cte_1 (f1) AS ( SELECT 1 ) SELECT f1 FROM cte_1 Можно использовать несколько cte последовательно, т.е. например (вместо select выше): , -- запятая обязательно cte_2 (f1, f2) AS ( SELECT f1, f1*10 FROM cte_1 ) SELECT * FROM cte_2 |
|||
11
palpetrovich
22.10.16
✎
15:50
|
(10) простейший пример я раскурил, но вот как мне это может помочь в задачке из (0) - не понимаю
зы скл-запросами занимаюсь пол-года, может поэтому туплю |
|||
12
palpetrovich
22.10.16
✎
15:52
|
+(11) впрочем, вроде забрежил свет в конце тунеля из этого:
;WITH cte_1 (f1) AS ( SELECT 1 ) , cte_2 (f1, f2) AS ( SELECT f1, f1*10 FROM cte_1 ) SELECT * FROM cte_2 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |