Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.24;
Скачать: CL | DM;

Вниз

Запрос с вычислением   Найти похожие ветки 

 
DimDim ©   (2006-07-19 22:08) [0]

Уважаемые Мастера, что-то я перегрелся! Помогите разобраться.
Есть две таблицы, по которым составлен запрос с вычисляемым полем.
Tab1
Kod Kol

1 100
2 150
3 200
Tab2
Kod Reliz

1 20
3 30

Запрос:
SELECT
 Tab1.Kod,  Tab1.Kol,  Tab2.Reliz,
   (Tab1.Kol - Tab2.Reliz) AS Ostatok
FROM
 Tab1LEFT OUTER JOIN Tab2 ON (Tab1.Kod = Tab2.Kod)


дает результат:
Kod Kol Reliz Ostatok
1 100 20 80
2 150 Null Null
3 200 30 170

Как сделать, чтобы во 2-й строке место Null были реальные числа ( т.е. 0 и 150 )?
Заранее благодарен.


 
sniknik ©   (2006-07-19 22:58) [1]

> чтобы во 2-й строке место Null были реальные числа
надо их туда реально подставить если null...

p.s. реальность зависит от движка.


 
Johnmen ©   (2006-07-19 23:28) [2]

реальность зависит от СУБД.


 
DimDim ©   (2006-07-19 23:30) [3]

Базы DBISAM. Аналогично Paradox, dBASE.


 
Johnmen ©   (2006-07-19 23:45) [4]

а движок?


 
DimDim ©   (2006-07-19 23:54) [5]

Базы DBISAM используют собственный движок (компилируется в саму программу). Построение запросов полностью соответствует Local SQL.


 
Johnmen ©   (2006-07-20 00:02) [6]

Тогда универсальное решение - заменить в таблице все null на 0 для соотв.полей.


 
DimDim ©   (2006-07-20 00:24) [7]

Дык, я и спрашиваю как в это сделать в одном запросе?
В принципе, я уже решил проблему через временную таблицу. Т.е. сначала делается запрос с созданием набора данных, а потом запрос на его изменение по определенным условиям.
Через ж..., конечно, но работает.


 
Johnmen ©   (2006-07-20 00:31) [8]

>[6]

UPDATE Table SET Field=0 WHERE Field IS NULL


 
ЮЮ ©   (2006-07-20 11:16) [9]

1)
Выкинуть (Tab1.Kol - Tab2.Reliz) AS Ostatok из запроса, сделав вычислимым полем.
0 в Reliz можно получить также в доп.вычислимом поле.

если всеже хочется в запросе, то:

SELECT
Tab1.Kod,  Tab1.Kol,  Tab2.Reliz,  (Tab1.Kol - Tab2.Reliz) AS Ostatok
FROM
Tab1
JOIN Tab2 ON (Tab1.Kod = Tab2.Kod)

 /* выбираем лишь те строки, для которых существует пара в Tab2 */

UNION

SELECT
 Tab1.Kod,  Tab1.Kol,  0,  Tab1.Kol
FROM
 Tab1
 LEFT JOIN Tab2 ON (Tab1.Kod = Tab2.Kod)
WHERE
 Tab2.Kod IS NULL

/* выбираем лишь те строки, для которых нет пары в Tab2 */

0 возможно потребуется явно привести к типу поля Tab2.Reliz, если возниккнет ошибка приведенеи типов


 
DimDim ©   (2006-07-26 11:51) [10]

Еще один вариант:

SELECT Tab1.Kod, Tab1.Kol, Tab2.Reliz,
 IF(Tab2.Reliz = Null
 THEN Tab1.Kol  ELSE (Tab1.Kol - Tab2.Reliz)) AS Ostatok
FROM
Tab1 LEFT OUTER JOIN Tab2 ON (Tab1.Kod = Tab2.Kod)


 
ЮЮ ©   (2006-07-26 11:57) [11]

IF(Tab2.Reliz = Null
THEN Tab1.Kol  ELSE (Tab1.Kol - Tab2.Reliz)) AS Ostatok

Странный синтаксис. Это где такой используется?
В Local SQL   IF THEN ELSE никаких нет
В других, известных мне,  Tab2.Reliz = Null  всегда даст FALSE


 
sniknik ©   (2006-07-26 11:58) [12]

> Еще один вариант: ...

> Базы DBISAM используют собственный движок (компилируется в саму программу). Построение запросов полностью
>  соответствует Local SQL.

в локал sql нет контрукции IF(... THEN ... ELSE ...), значит или не полностью соотствует или не будет работать.



Страницы: 1 вся ветка

Текущий архив: 2006.09.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
2-1157458352
barakuda
2006-09-05 16:12
2006.09.24
Запрос чегото, нетого ...


2-1157446344
Ivanna
2006-09-05 12:52
2006.09.24
Строка в строку из кодов символов


1-1155712316
DelphiLexx
2006-08-16 11:11
2006.09.24
Получить данные из Clipboard зная формат


2-1157354134
Mamochka
2006-09-04 11:15
2006.09.24
Как посчитать сколько прошло ГГГГ.ММ.ДД


15-1157178804
Yeg
2006-09-02 10:33
2006.09.24
Перемещение кота из сельской местности в город