|
Поясните почему не работает запрос? | ☑ | ||
---|---|---|---|---|
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
|
ну мне показалось это нелогичным, понятно, что вопрос в плане ...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |