Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: СКЛ-запрос. Получение максимальной и средневзвешенной цен. Нужна отимизация

v7: СКЛ-запрос. Получение максимальной и средневзвешенной цен. Нужна отимизация
Я
   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.МаксЦена)
 
 
   Это_mike
 
1 - 21.10.16 - 13:54
а кто может запретить?
   palpetrovich
 
2 - 21.10.16 - 13:56
(1) не получается :(
подскажи как пожалуйста
   palpetrovich
 
3 - 21.10.16 - 14:02
+(2) пробовал так
    ( 
    (insert into @Таб_тмп
    SELECT 
        Т.Товар
        ,Т.МаксЦена
        ,Т.КвоПартии
        ,Т.Партия
        ,Т.ИдСтроки
    FROM @ТаблицаРезультат Т
    where Т.МаксЦена =(SELECT Max(Т0.МаксЦена) FROM @ТаблицаРезультат AS Т1  where Т.Товар = Т1.Товар)
    )
    SELECT
        Товар
        ,МаксЦенаВходГрн
        ,КвоПартии
        ,Партия
        ,ИдСтроки
        FROM  @Таб_тмп
    ) ТТ

но это из области фантастики наверное
   palpetrovich
 
4 - 21.10.16 - 14:03
*
where Т.МаксЦена =(SELECT Max(Т1.МаксЦена) FROM @ТаблицаРезультат AS Т1  where Т.Товар = Т1.Товар)
ошибка копи-пасте :)
   palpetrovich
 
5 - 21.10.16 - 14:14
Майк ушел, по-ходу ловить нечего :)
   youalex
 
6 - 21.10.16 - 14:23
(0) используй CTE
   palpetrovich
 
7 - 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.
   Djelf
 
8 - 21.10.16 - 21:26
(7) СТЕ как раз очень приемлемо. А вот готовить действительно не умеешь (cte находятся перед селектом из них): https://msdn.microsoft.com/ru-ru/library/ms175972.aspx?f=255&MSPPError=-2147217396
   palpetrovich
 
9 - 22.10.16 - 15:00
(8) по ссылке - "Не удаётся завершить защищённую транзакцию"
"cte находятся перед селектом из них" - тут явно что-то пропущено :)
   youalex
 
10 - 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
 
 Рекламное место пустует
   palpetrovich
 
11 - 22.10.16 - 15:50
(10) простейший пример я раскурил, но вот как мне это может помочь в задачке из (0) - не понимаю
зы скл-запросами занимаюсь пол-года, может поэтому туплю
   palpetrovich
 
12 - 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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует