Имя: Пароль:
1C
1С v8
Поясните почему не работает запрос?
0 izekia
 
15.07.12
23:47
SELECT
   T1.Q_002_F_000RRef,
   T1.Q_002_F_001_,
   T1.Q_002_F_002_,
   T1.Q_002_F_003_
FROM
   (SELECT
       T2.Q_001_F_000RRef AS Q_002_F_000RRef,
       T2.Q_001_F_001_ AS Q_002_F_001_,
       T2.Q_001_F_002_ AS Q_002_F_002_,
       CAST(
           CASE
               WHEN (T2.Q_001_F_001_ > T2.Q_001_F_002_) THEN (((CAST(T2.Q_001_F_001_ AS NUMERIC(18, 8)) / T2.Q_001_F_002_) - 1.0) * 100.0)
               ELSE (CAST(((CAST(T2.Q_001_F_002_ AS NUMERIC(37, 8)) / T2.Q_001_F_001_) - CAST(1.0 AS NUMERIC(38, 8))) AS NUMERIC(34, 8)) * 100.0)
           END AS NUMERIC(15, 2)) AS Q_002_F_003_
   FROM
       (SELECT
           T4._IDRRef AS Q_001_F_000RRef,
           T4._Fld2071 AS Q_001_F_001_,
           CAST(SUM(((T3._Fld1866 + T3._Fld1969) * T3._Fld2675)) AS NUMERIC(37, 8)) AS Q_001_F_002_
       FROM
           _Document1823_VT1852 T3 WITH(NOLOCK)
           LEFT OUTER JOIN _Document1823 T4 WITH(NOLOCK)
           ON T3._Document1823_IDRRef = T4._IDRRef
       WHERE
           (T4._Fld2071 > 0)
       GROUP BY
           T4._IDRRef,
           T4._Fld2071
       HAVING
           ((CAST(SUM(((T3._Fld1866 + T3._Fld1969) * T3._Fld2675)) AS NUMERIC(37, 8)) > 0)
           AND (CAST(SUM(((T3._Fld1866 + T3._Fld1969) * T3._Fld2675)) AS NUMERIC(37, 8)) <> T4._Fld2071))
       ) T2
   ) T1
--WHERE T1.Q_002_F_003_ > 5

Если раскомментировать условие, то возникает ошибка деления на ноль
1 izekia
 
15.07.12
23:48
вот запрос из 1С:

ВЫБРАТЬ
   ВложенныйЗапрос.Ссылка,
   ВложенныйЗапрос.ЦенаСчета,
   ВложенныйЗапрос.СуммаТЧ,
   ВложенныйЗапрос.ПроцентОтклонения
ИЗ
   (ВЫБРАТЬ
       ВложенныйЗапрос.Ссылка КАК Ссылка,
       ВложенныйЗапрос.ЦенаСчета КАК ЦенаСчета,
       ВложенныйЗапрос.СуммаТЧ КАК СуммаТЧ,
       ВЫРАЗИТЬ(ВЫБОР
               КОГДА ВложенныйЗапрос.ЦенаСчета > ВложенныйЗапрос.СуммаТЧ
                   ТОГДА (ВложенныйЗапрос.ЦенаСчета / ВложенныйЗапрос.СуммаТЧ - 1) * 100
               ИНАЧЕ (ВложенныйЗапрос.СуммаТЧ / ВложенныйЗапрос.ЦенаСчета - 1) * 100
           КОНЕЦ КАК ЧИСЛО(15, 2)) КАК ПроцентОтклонения
   ИЗ
       (ВЫБРАТЬ
           СчетЗаказМатериалаСписокНоменклатуры.Ссылка.Ссылка КАК Ссылка,
           СчетЗаказМатериалаСписокНоменклатуры.Ссылка.ЦенаСчета КАК ЦенаСчета,
           СУММА((СчетЗаказМатериалаСписокНоменклатуры.Количество + СчетЗаказМатериалаСписокНоменклатуры.ВНакладнойНаПоставку) * СчетЗаказМатериалаСписокНоменклатуры.Цена) КАК СуммаТЧ
       ИЗ
           Документ.СчетЗаказМатериала.СписокНоменклатуры КАК СчетЗаказМатериалаСписокНоменклатуры
       ГДЕ
           СчетЗаказМатериалаСписокНоменклатуры.Ссылка.ЦенаСчета > 0
       
       СГРУППИРОВАТЬ ПО
           СчетЗаказМатериалаСписокНоменклатуры.Ссылка.Ссылка,
           СчетЗаказМатериалаСписокНоменклатуры.Ссылка.ЦенаСчета
       
       ИМЕЮЩИЕ
           СУММА((СчетЗаказМатериалаСписокНоменклатуры.Количество + СчетЗаказМатериалаСписокНоменклатуры.ВНакладнойНаПоставку) * СчетЗаказМатериалаСписокНоменклатуры.Цена) > 0 И
           СУММА((СчетЗаказМатериалаСписокНоменклатуры.Количество + СчетЗаказМатериалаСписокНоменклатуры.ВНакладнойНаПоставку) * СчетЗаказМатериалаСписокНоменклатуры.Цена) <> СчетЗаказМатериалаСписокНоменклатуры.Ссылка.ЦенаСчета) КАК ВложенныйЗапрос) КАК ВложенныйЗапрос
//ГДЕ ВложенныйЗапрос.ПроцентОтклонения > 5
2 mikecool
 
15.07.12
23:51
при ошибке всегда есть строка запроса, которая ее генерит
3 Живой Ископаемый
 
15.07.12
23:57
а если поменять
ВЫБОР
               КОГДА ВложенныйЗапрос.ЦенаСчета > ВложенныйЗапрос.СуммаТЧ
                   ТОГДА (ВложенныйЗапрос.ЦенаСчета / ВложенныйЗапрос.СуммаТЧ - 1) * 100
               ИНАЧЕ (ВложенныйЗапрос.СуммаТЧ / ВложенныйЗапрос.ЦенаСчета - 1) * 100
на

ВЫБОР
               КОГДА ВложенныйЗапрос.ЦенаСчета > ВложенныйЗапрос.СуммаТЧ И ВложенныйЗапрос.СуммаТЧ=0 ТОГДА 0
КОГДА ВложенныйЗапрос.ЦенаСчета > ВложенныйЗапрос.СуммаТЧ
                   ТОГДА (ВложенныйЗапрос.ЦенаСчета / ВложенныйЗапрос.СуммаТЧ - 1) * 100
КОГДА  ВложенныйЗапрос.ЦенаСчета=0 ТОГДА 0
              ИНАЧЕ (ВложенныйЗапрос.СуммаТЧ / ВложенныйЗапрос.ЦенаСчета - 1) * 100

с условием и без?
4 izekia
 
16.07.12
00:00
(3) да уже на склру подсказали, посмотрел план запроса, действительно оказалось немного неожиданно для меня
5 izekia
 
16.07.12
00:01
добавил в кейс проверку на ноль и все заработало, фильтр применялся уже после вычисления полей
6 mikecool
 
16.07.12
00:15
(4) а что оказалось неожиданным? что при делении на ноль ошибка бывает?
7 izekia
 
16.07.12
00:35
(6) в том что без фильтра ГДЕ ВложенныйЗапрос.ПроцентОтклонения > 5 запрос работает
а с ним - нет, то есть получаем что полная выборка у нас работает, а при ограничении выборки возникает проблема
для меня это неожиданно
8 Живой Ископаемый
 
16.07.12
00:46
ну, это проблемы планировщика sql.. запрос-то что так что так одинаковый...
Это что-то типа
оптимизации логических выражений. Например в 77 если написать
Если Истина Или Документ.МетодКоторогоНесуществует() Тогда
была бы ошибка.
И в 8.х - прокатит
аналогия конечно кривенькая, но примерно так...
9 izekia
 
16.07.12
00:56
ну мне показалось это нелогичным, понятно, что вопрос в плане ...
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.