Главная страница
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.028 c
15-1157135123
Nic
2006-09-01 22:25
2006.09.24
ИБП?


2-1157009368
Patrick
2006-08-31 11:29
2006.09.24
Access violation...


2-1157610368
worldmen
2006-09-07 10:26
2006.09.24
Востановление системных файлов в XP


15-1156092579
Юрий Зотов
2006-08-20 20:49
2006.09.24
И снова о демократии на "Мастаках" о:)


15-1157185940
мнм
2006-09-02 12:32
2006.09.24
программист <> кодер