Имя: Пароль:
1C
1C 7.7
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
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший