Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Произведение ненулевых столбцов / 14 сообщений из 14, страница 1 из 1
29.10.2008, 14:52
    #35623096
nastasjal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение ненулевых столбцов
У меня в программе надо считать произведение 3-х столбцов при условии что элемент не ноль (например если 2 0 3 то произведение будет 6). Можно ли это как-либо написать sql-запросом? Просто иначе выпоолняется все очень долго.
Подскажите пожалуйста!
...
Рейтинг: 0 / 0
29.10.2008, 14:56
    #35623111
homik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение ненулевых столбцов
Select (Iif(fld1=0,1,fld1)*Iif(fld2=0,1,fld2)*Iif(fld3=0,1,fld3)) as some_name From....
...
Рейтинг: 0 / 0
29.10.2008, 15:07
    #35623147
nastasjal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение ненулевых столбцов
Спасибо большое. Получилось!!!!!!
...
Рейтинг: 0 / 0
29.10.2008, 15:58
    #35623314
Galyamov Rinat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение ненулевых столбцов
А если все столбцы = 0 ?


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
29.10.2008, 16:52
    #35623550
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение ненулевых столбцов
В версии VFP8 введена функция EVL(), которая возвращает первое значение отличное от EMPTY(). Для числовых значений 0 и есть пустое значение. Т.е. выражение можно записать короче

Код: plaintext
EVL(fld1, 1 )*EVL(fld2, 1 )*EVL(fld3, 1 ) as newField
...
Рейтинг: 0 / 0
29.10.2008, 17:12
    #35623628
гость...
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение ненулевых столбцов
Код: plaintext
1.
EVL(fld1, 1 )*EVL(fld2, 1 )*EVL(fld3, 1 )*iif(fld1+fld2+fld3= 0 , 0 , 1 ) 
...
Рейтинг: 0 / 0
29.10.2008, 17:40
    #35623738
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение ненулевых столбцов
гость...
Код: plaintext
EVL(fld1, 1 )*EVL(fld2, 1 )*EVL(fld3, 1 )*iif(fld1+fld2+fld3= 0 , 0 , 1 )

Это не сработает, если поля могут принимать отрицательные значения.

В общем случае, выражение от набора полей не поможет определить пустоту каждого поля в отдельности. В принципе, можно написать так

Код: plaintext
EVL(fld1, 1 )*EVL(fld2, 1 )*EVL(fld3, 1 )*abs(sign(EVL(fld1,EVL(fld2,fld3)))) as newField

или так

Код: plaintext
EVL(fld1, 1 )*EVL(fld2, 1 )*EVL(fld3, 1 )*iif(fld1= 0  AND fld2= 0  AND fld3= 0 ,  0 ,  1 ) as newField

Насколько понимаю, вариант, когда два поля из трех пустые, специально рассматривать не имеет смысла.
...
Рейтинг: 0 / 0
29.10.2008, 20:51
    #35624128
FAM
FAM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение ненулевых столбцов
Это точно работает:

select nvl(fld1,100) as F1, nvl(fld2,5) as F2, nvl(fld1,12) as F3 from DUAL into table AAA
...
Рейтинг: 0 / 0
30.10.2008, 00:39
    #35624329
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение ненулевых столбцов
FAMЭто точно работает:

select nvl(fld1,100) as F1, nvl(fld2,5) as F2, nvl(fld1,12) as F3 from DUAL into table AAA
Вы путаете понятия "пустое значение" и значение NULL. Это "две большие разницы".

NULL - это не известное значение. В данном случае, неизвестно равно оно нулю или нет.
Пустое - это вполне определенное значение. В данном случае, как раз и равное нулю.

NVL() - проверка на значение NULL
EVL() - проверка на пустое значение. Для чисел, проверка на значение 0.
...
Рейтинг: 0 / 0
30.10.2008, 14:18
    #35625562
beginner_foxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение ненулевых столбцов
nastasjalУ меня в программе надо считать произведение 3-х столбцов при условии что элемент не ноль (например если 2 0 3 то произведение будет 6). Можно ли это как-либо написать sql-запросом? Просто иначе выпоолняется все очень долго.
Подскажите пожалуйста!

Код: plaintext
1.
2.
select icase(a= 0 , 1 ,a)*icase(b= 0 , 1 ,b)*icase(c= 0 , 1 ,c)
from MyTable
where a <> 0  and b<> 0  and c<> 0 
...
Рейтинг: 0 / 0
30.10.2008, 14:55
    #35625720
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение ненулевых столбцов
beginner_foxxnastasjalУ меня в программе надо считать произведение 3-х столбцов при условии что элемент не ноль (например если 2 0 3 то произведение будет 6). Можно ли это как-либо написать sql-запросом? Просто иначе выпоолняется все очень долго.
Подскажите пожалуйста!
Код: plaintext
1.
2.
select icase(a= 0 , 1 ,a)*icase(b= 0 , 1 ,b)*icase(c= 0 , 1 ,c)
from MyTable
where a <> 0  and b<> 0  and c<> 0 

Не то, чтобы данный код был совсем уж бессмысленным, но он, во-первых, избыточный, а, во-вторых, не решает поставленную задачу.

Условие

where a<>0 and b<>0 and c<>0

означает, что ВСЕ поля одновременно отличны от 0. Нет смысла сравнивать значения с нулем, если все нулевые значения уже отсечены. Возможно, здесь предполагалось OR вместо AND? Т.е. надо бы писать

where a<>0 or b<>0 or c<>0

Тогда смысл появляется. Это условие отсекает только те записи, у которых все поля равны нулю. Однако из постановки задачи не ясно, а надо ли их отсекать? Или оставить, но установить значение выражения равным 0?

А насчет избыточности...

icase() все-таки предполагает наличие нескольких последовательных условий. Если надо проверить всего-лишь одно, то почему недостаточно iif()? А если проверка на пустое значение, то почему не использовать EVL()?
...
Рейтинг: 0 / 0
30.10.2008, 15:13
    #35625789
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение ненулевых столбцов
Можно я тоже свой изврат предложу:
Код: plaintext
EVL(a*b*c, EVL(a*b, EVL(a*c, EVL(b*c, EVL(a, EVL(b, EVL(c, NULL)))))))

PS Автор топика похоже давно проблему порешал и другими занимается.
...
Рейтинг: 0 / 0
30.10.2008, 17:34
    #35626220
beginner_foxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение ненулевых столбцов
ВладимирМbeginner_foxx[quot nastasjal]У меня в программе надо считать произведение 3-х столбцов при условии что элемент не ноль (например если 2 0 3 то произведение будет 6). Можно ли это как-либо написать sql-запросом? Просто иначе выпоолняется все очень долго.
Подскажите пожалуйста!
Код: plaintext
1.
2.
select icase(a= 0 , 1 ,a)*icase(b= 0 , 1 ,b)*icase(c= 0 , 1 ,c)
from MyTable
where a <> 0  and b<> 0  and c<> 0 


авторНе то, чтобы данный код был совсем уж бессмысленным, но он, во-первых, избыточный, а, во-вторых, не решает поставленную задачу.
Не соглашусь :-))

nastasjal
У меня в программе надо считать произведение 3-х столбцов при условии что элемент не ноль

Код: plaintext
1.
2.
Условие 
where a<> 0  and b<> 0  and c<> 0 
означает, что ВСЕ поля одновременно отличны от  0 . Нет смысла сравнивать значения с нулем, если все нулевые значения уже отсечены.
Это сделанно чтобы результат произведения трех нулей не попал в выборку-по условию.
Код: plaintext
1.
2.
 Возможно, здесь предполагалось OR вместо AND? Т.е. надо бы писать
where a<> 0  or b<> 0  or c<> 0 
Тогда смысл появляется. Это условие отсекает только те записи, у которых все поля равны нулю. 
Можно и так :-)

авторicase() все-таки предполагает наличие нескольких последовательных условий. Если надо проверить всего-лишь одно, то почему недостаточно iif()? А если проверка на пустое значение, то почему не использовать EVL()?
icase ближе к стандарту спецификации SQL case-конструкции , но как говориться на вкус и цвет товарищей нет
...
Рейтинг: 0 / 0
31.10.2008, 09:35
    #35627004
beginne_fox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение ненулевых столбцов
ВладимирМ
Условие
where a<>0 and b<>0 and c<>0
означает, что ВСЕ поля одновременно отличны от 0. Нет смысла сравнивать значения с нулем, если все нулевые значения уже отсечены. Возможно, здесь предполагалось OR вместо AND? Т.е. надо бы писать
where a<>0 or b<>0 or c<>0
Тогда смысл появляется. Это условие отсекает только те записи, у которых все поля равны нулю. Однако из постановки задачи не ясно, а надо ли их отсекать? Или оставить, но установить значение выражения равным 0?

Да, Вы правы.
Я хотел отсечь записи, у которых все поля равны нулю, надо писать именно так
where a<>0 or b<>0 or c<>0
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Произведение ненулевых столбцов / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]