Страница 1 из 1

головоломный запрос (для меня)

Добавлено: 21 авг 2005, 16:33
Al-r
Состав таблиц:
tdogovor:
kl - numeric not null PK
bdj - numeric(3, 0)

tsveddog:
kl - numeric not null PK
dvid - varchar (хранит дату содержит значения ' . . ' - если дата не введена и собственно дату)

справочник
sprbdj:
kodbdj integer - содержит код бюджета, в tdogovor.bdj заносится код из этого справочника
bdj varchar - содержит название бюджета соответствующее полю kodbdj.

Возможно ли сделать запрос с таким смыслом:

мой запрос:
select count(kl), b.bdj,
sum(if (c.dvid <>' . . ') then 1 else 0 ) <-----такой смысл
from tdogovor a left join sprbdj b on a.bdj=b.kodbdj
left join tsveddog c on a.kl=c.kl
group by bdj

Мне надо чтобы возвращалось количество дат для каждой отдельной группы.
БД InterBase 6.0
Помогите пожалуйста начинающему.

Добавлено: 21 авг 2005, 22:36
kdv
БД InterBase 6.0
если тебя сильно держит эта версия, что в общем то странно, то тогда только udf. А в FB 1.5 такое можно через case.

и еще комментарии:

1. наверное вместо numeric имелся в виду integer. не надо как в dbf. в SQL серверах если нужно целое число, просто пишут integer, а не numeric(3,0).
2. не переборщил ли ты с left join? а то как то странно все выглядит, по крайней мере не зная прикладной области...

Добавлено: 22 авг 2005, 12:48
Ivan_Pisarevsky
dvid - varchar (хранит дату содержит значения ' . . ' - если дата не введена и собственно дату)
Что мешает использовать стандартный timestamp для дат и не парить мозги всякимии преобразованиями?

честно говоря нифига не понял как устроены таблицы и как они связаны... Еще разок по-русски для особо одаренных мона ?

Про ИБ 6 тоже уж сказано...

Добавлено: 24 авг 2005, 18:51
Al-r
Всем спасибо за внимание к моему вопросу, извените что долго не мог ответить.
kdv писал(а):
БД InterBase 6.0
если тебя сильно держит эта версия, что в общем то странно, то тогда только udf. А в FB 1.5 такое можно через case.

и еще комментарии:

1. наверное вместо numeric имелся в виду integer. не надо как в dbf. в SQL серверах если нужно целое число, просто пишут integer, а не numeric(3,0).
2. не переборщил ли ты с left join? а то как то странно все выглядит, по крайней мере не зная прикладной области...
Собственно такая версия InterBase используется поскольку она бесплатная (в моем регионе похоже что фиг кого разоришь на что-либо лицензионное), хотелось бы использовать FireBird, но приложение использует компоненты Delphi с политры InterBase, не будет ли каких проблем?
Насчет numeric то ты прав это надо пофиксить, спасибо.
Left join это у меня было от неизбежности, незнал как сделать такой запрос. А вообще все решилось очень просто, через использование хранимых процедур.

Ivan_Pisarevsky писал(а):Цитата:
dvid - varchar (хранит дату содержит значения ' . . ' - если дата не введена и собственно дату)

Что мешает использовать стандартный timestamp для дат и не парить мозги всякимии преобразованиями?

честно говоря нифига не понял как устроены таблицы и как они связаны... Еще разок по-русски для особо одаренных мона ?
Проблема моих дат состоит в том что заранее неизвестно будет пользователь вводить дату или оставит это поле незаполненным, то есть при сохранении придется или забивать левое значение, или делать сложный анализ в приложении при формировании запроса (вобще-то у меня в базе 12 таблиц, в каждой примерно 30 полей, от 10 до 15 из них даты), по этому пришлось так изголяться. Если есть способ более красивый и удобный то подскажите пожалуйста, т.к приложение и база пока в разработке то есть возможность поправить.
Если все еще интересно то все таблицы связаны по полю kl которое хранит код клиента, существует таблица tdogovor в которой это поле является уникальным, а остальные таблицы являются подчиненными. Вних может быть несколько записей принадлежащих одной записи таблицы tdogovor и соответственно будет несколько записей с обним значением в поле kl. Естественно в каждой таблице есть автоинкрементное поле.

Добавлено: 24 авг 2005, 19:20
Merlin
Al-r писал(а): Собственно такая версия InterBase используется поскольку она бесплатная (в моем регионе похоже что фиг кого разоришь на что-либо лицензионное), хотелось бы использовать FireBird, но приложение использует компоненты Delphi с политры InterBase, не будет ли каких проблем?
Не, с этой поллитрой никаких проблем не будет ;) Возможны проблемы с уже работающими запросами, но оно к лучшему - IB пропускает некоторые варианты некорректных-неоднозначных запросов, которые, в зависимости от фазы луны, могут возвращать то что ты планировал, а могут и фигню какую-нибудь.
Al-r писал(а): Проблема моих дат состоит в том что заранее неизвестно будет пользователь вводить дату или оставит это поле незаполненным, то есть при сохранении придется или забивать левое значение, или делать сложный анализ в приложении при формировании запроса
Да ничего сложного. Основное тело запроса (Select ... From) укладывешь в какую-нибудь invisible мемку, при нажатии кнопки чтения после установки условий фильтрации складываешь его в .SQL запроса, добавляешь Add-ами текущее Where по состоянию контролов управления фильтрацией, не забываешь приaddить сзаду Order By, Group и Having если надо и открываешь.

Добавлено: 24 авг 2005, 20:05
kdv
Собственно такая версия InterBase используется поскольку она бесплатная (в моем регионе похоже что фиг кого разоришь на что-либо лицензионное), хотелось бы использовать FireBird, но приложение использует компоненты Delphi с политры InterBase, не будет ли каких проблем?
"она бесплатная" - вы не в лесу живете? :) в FAQ на ibase.ru все написано.
насчет компонент - а попробовать? На сайте где-нибудь написано, что будут проблемы с IBX + Firebird?
В самом начале
http://www.ibase.ru/devinfo/ibx.htm
написано:
"С помощью IBX (и FIBPlus) можно работать с любыми версиями InterBase, Firebird и Yaffil."

вот же, сидят люди на глюкавом сервере пятилетней давности, и боятся каких то мифических проблем. :) IB 6.0 надо бояться.

Добавлено: 25 авг 2005, 09:53
Ivan_Pisarevsky
Проблема моих дат состоит в том что заранее неизвестно будет пользователь вводить дату или оставит это поле незаполненным, то есть при сохранении придется или забивать левое значение, или делать сложный анализ в приложении при формировании запроса
Что мешает использовать стандартную конструкцию
"some_field is null"
"some_field is not null"

Пользую IBX, в паре с ФБ1.5.2 (перешел после иб6 уж почти год как) проблемы только если сам чего-нидь напортачу :lol:
Переход полностью исчерпал проблему со скоростью работы(самый долгий отчет собирается максимум секунд за пять, вместе с фетчем полученых записей), правда у меня размеры "детские" БД всего 100 мегов и таблиц меньше ста :)
Возможны проблемы с уже работающими запросами
например груп бай по одному полю, а ордер бай по другому.
ИБ 6 такое пропускал, ФБ нет.
не переборщил ли ты с left join? а то как то странно все выглядит, по крайней мере не зная прикладной области...
автору топика - Если четко не знаешь для чего тот или иной тип джойна предназначен, сделай их пока(на время учебы) неявными, файрберд вполне интелектуален чтоб все правильно приджойнить.

Код: Выделить всё

select count(kl), b.bdj, 
sum(if (c.dvid <>' . . ') then 1 else 0 ) <-----такой смысл 
from tdogovor a left join sprbdj b on a.bdj=b.kodbdj 
left join tsveddog c on a.kl=c.kl 
group by bdj 

Код: Выделить всё

select count(kl), b.bdj, 
from tdogovor a, sprbdj b, tsveddog c
where a.bdj=b.kodbdj and a.kl=c.kl and c.dvid is null 
group by bdj