Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.061 c
3-1153895544
Андрей Пл
2006-07-26 10:32
2006.09.24
TClientDataSet максимальное количество полей


1-1155124874
TAS
2006-08-09 16:01
2006.09.24
Проблема с копированием файлов


15-1157526130
Задачник
2006-09-06 11:02
2006.09.24
Еще один баян.


15-1157243641
RASkov
2006-09-03 04:34
2006.09.24
Сенькс за помощь


2-1157368943
*Ray*
2006-09-04 15:22
2006.09.24
Запрос SQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский