Страница 1 из 1
Прямой SQL - корявый CASE
Добавлено: 09 фев 2010, 13:50
Masygreen
Очень хочется сделать прямым ... запрос на строк 30 красивый и быстрый .. делать не прямым ...
хз сколько займет ...даже как подумаю плохо становится .. ведь нет HAVING ни Sum ни IN ни Group +куча вложеных ...
Сабж ...это первый ...
работает
Код: Выделить всё
sqlAddStr(stmt_str,',case when katnotes.name = ? then 0 else 1 end as col_note');
не работает
Код: Выделить всё
sqlAddStr(stmt_str,',case when katnotes.name = ? or katnotes.name = ? then 0 else 1 end as col_note');
Ошибка(3,29): Ожидалось : "THEN"
не работает
Код: Выделить всё
sqlAddStr(stmt_str,',case when (katnotes.name = ? or katnotes.name = ?) then 0 else 1 end as col_note');
Ошибка(3,26): Ожидалось : ")"
Каким образом победить??
Добавлено: 09 фев 2010, 17:02
Den
Судя по всему Вы хотите отдать параметры в секцию select.
Я так понял, шо это возбраняется нынче (
Добавлено: 09 фев 2010, 17:05
Masygreen
Den писал(а):Судя по всему Вы хотите отдать параметры в секцию select.
Я так понял, шо это возбраняется нынче (
не совсем... все работает если в условии Case when одно сравнение.. а если двойное неравенство начинает ругаться ... те
работает
уже нет
Добавлено: 09 фев 2010, 17:11
Den
А что значит работает ? В смысле компилятор проглатывает и ресурс собирается или на выполнение окейно отрабатывает и результаты правильные запрос выводит ?
Добавлено: 09 фев 2010, 17:42
Masygreen
Den писал(а):А что значит работает ? В смысле компилятор проглатывает и ресурс собирается или на выполнение окейно отрабатывает и результаты правильные запрос выводит ?
опа.. а слона то я и не заметил ...
вообще ни хера не работает ... блин ... аффигеть ... вобщем вмето 30 строк сиквела ...придется 100500 випа теперь окчеврыжить ....
Добавлено: 09 фев 2010, 19:04
edward_K
поищите "Вложенный запрос" в vipprogr - могет это вам поможет
наверное в конструкции insert into ????? [(,,)] as select .. он сработает. Лучше использовать синонимы. В сапорте вроде как пашет, правда не сильно резал по условиям.
Добавлено: 09 фев 2010, 19:54
Masygreen
я просто упростил вопрос .. на самом деле хочу вот это запихнуть
я наверно очень наивный мечтатель???
(В кратце - ищем обьекты по которым все договора выполнены и перевод в этот статус попадает в период, а потом раскидываем по ЦО)
Код: Выделить всё
select
t$fpco.f$ABBR as namefpco
,t$katstroy.f$name as nreckatstoy
from(
select distinct
t$dogovor.f$nrec as nrecdogovor
,t$dogovor.f$tidk as tidkdogovor
,t$dogovor.f$nodoc as nodocdogovor
,(select top 1 t$SpecMTR.f$cObj from t$spdocs inner join t$SpecMTR on t$spdocs.f$nRec=t$SpecMTR.f$cSpec and 1723=t$SpecMTR.f$COTABLE
and t$SpecMTR.f$CSALDTUNE=0x8001000000000001 where t$spdocs.f$cdoc = t$dogovor.f$nrec and t$spdocs.f$tidk in (400,401)) as nreckatstoy
from t$dogovor )as table01
left outer join t$attrdog on nrecdogovor=t$attrdog.f$cdogovor
inner join t$fpco on t$attrdog.f$cpodr = t$fpco.f$nrec
inner join t$katstroy on nreckatstoy=t$katstroy.f$nrec and
nreckatstoy in
(select
nreckatstoy as nreckatstoy
from
(select
nreckatstoy as nreckatstoy
,case when (t$katnotes.f$name = 'выполнен' or t$katnotes.f$name = 'расторгнутый' or t$katnotes.f$name = 'закрыт') then 0 else 1 end as col_note
,case when (select min(t$statlog.f$doper) as min_date from t$statlog where t$statlog.f$cdoc=nrecdogovor and t$statlog.f$doctype=tidkdogovor and t$statlog.f$cnewnote = nrecnote)>=131662608
and (select min(t$statlog.f$doper) as min_date from t$statlog where t$statlog.f$cdoc=nrecdogovor and t$statlog.f$doctype=tidkdogovor and t$statlog.f$cnewnote = nrecnote)<=131663122
then 1 else 0 end as col_date
from
(select distinct t$dogovor.f$nrec as nrecdogovor,t$dogovor.f$tidk as tidkdogovor,t$dogovor.f$cnote as nrecnote,
(select top 1 t$SpecMTR.f$cObj from t$spdocs inner join t$SpecMTR on t$spdocs.f$nRec=t$SpecMTR.f$cSpec
and 1723=t$SpecMTR.f$COTABLE and t$SpecMTR.f$CSALDTUNE=0x8001000000000001 where t$spdocs.f$cdoc = t$dogovor.f$nrec and t$spdocs.f$tidk in (400,401)) as nreckatstoy
from t$dogovor)as table02
inner join t$katnotes on nrecnote=t$katnotes.f$nrec
left outer join t$attrdog on nrecdogovor=t$attrdog.f$cdogovor
where nreckatstoy is not null) as table03
Group by nreckatstoy HAVING sum(col_note) =0 and sum(col_date)<>0)
group by t$katstroy.f$name,t$fpco.f$ABBR order by t$katstroy.f$name,t$fpco.f$ABBR
Добавлено: 09 фев 2010, 20:08
Masygreen
Masygreen писал(а):Den писал(а):А что значит работает ? В смысле компилятор проглатывает и ресурс собирается или на выполнение окейно отрабатывает и результаты правильные запрос выводит ?
опа.. а слона то я и не заметил ...
вообще ни хера не работает ... блин ... аффигеть ... вобщем вмето 30 строк сиквела ...придется 100500 випа теперь окчеврыжить ....
обманул ...одинарный case работает хоршо

но это не радует.
Зарегал в ПИр
Добавлено: 10 фев 2010, 11:38
Den
а если вместо :
...
case when (t$katnotes.f$name = 'выполнен' or t$katnotes.f$name = 'расторгнутый' or t$katnotes.f$name = 'закрыт') then 0 else 1 end as col_note
...
попробовать :
case when t$katnotes.f$name = 'выполнен' then 0
when t$katnotes.f$name = 'расторгнутый' then0
when t$katnotes.f$name = 'закрыт' then 0
else 1 end as col_note
Добавлено: 10 фев 2010, 11:44
Masygreen
Den писал(а):а если вместо :
...
case when (t$katnotes.f$name = 'выполнен' or t$katnotes.f$name = 'расторгнутый' or t$katnotes.f$name = 'закрыт') then 0 else 1 end as col_note
...
попробовать :
case when t$katnotes.f$name = 'выполнен' then 0
when t$katnotes.f$name = 'расторгнутый' then0
when t$katnotes.f$name = 'закрыт' then 0
else 1 end as col_note
это был общий пример ... там еще есть интервал дат - примерного вида
case when (t$dogovor.f$ddoc >= dStart or t$dogovor.f$ddoc <=dEnd) then 0 else 1 end as col_note
тут без end ну ни как
Добавлено: 10 фев 2010, 12:12
Den
Ну тады тока ждать когда поправят данные моментик (
Ну или пойти по ..
http://forum.galaktika.by/viewtopic.php?t=153
Но тогда Вы скептически высказались по поводу такого извращенного способа )
Добавлено: 10 фев 2010, 12:21
Masygreen
щас вдумался .. ваша идея мне понравилась попробую заменить двойное условие одинарными вложенными Case
Код: Выделить всё
case when datekatnotes>=? then
case when datekatnotes<=? then 1 else 0 end
else 0 end as col_date
интересно схавает или нет

Добавлено: 10 фев 2010, 13:58
Masygreen
итог .. да последний хитровыдуманный вариант сработал .. но попытка воткнуть еще один уровень временной таблицы уронил этот запрос ..

вобщем если case еще можно обойти то дальнейшие вложенные запросы у бивают эту идею наповал
