Прямой SQL - корявый CASE

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Прямой SQL - корявый CASE

Сообщение 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): Ожидалось : ")"

Каким образом победить??
Время ведет!
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

Судя по всему Вы хотите отдать параметры в секцию select.
Я так понял, шо это возбраняется нынче (
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Сообщение Masygreen »

Den писал(а):Судя по всему Вы хотите отдать параметры в секцию select.
Я так понял, шо это возбраняется нынче (
не совсем... все работает если в условии Case when одно сравнение.. а если двойное неравенство начинает ругаться ... те
работает

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

katnotes.name = ?
уже нет

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

katnotes.name = ? or katnotes.name = ?
Время ведет!
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

А что значит работает ? В смысле компилятор проглатывает и ресурс собирается или на выполнение окейно отрабатывает и результаты правильные запрос выводит ?
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Сообщение Masygreen »

Den писал(а):А что значит работает ? В смысле компилятор проглатывает и ресурс собирается или на выполнение окейно отрабатывает и результаты правильные запрос выводит ?
опа.. а слона то я и не заметил ...
вообще ни хера не работает ... блин ... аффигеть ... вобщем вмето 30 строк сиквела ...придется 100500 випа теперь окчеврыжить ....
Время ведет!
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

поищите "Вложенный запрос" в vipprogr - могет это вам поможет
наверное в конструкции insert into ????? [(,,)] as select .. он сработает. Лучше использовать синонимы. В сапорте вроде как пашет, правда не сильно резал по условиям.
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Сообщение 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 
Время ведет!
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Сообщение Masygreen »

Masygreen писал(а):
Den писал(а):А что значит работает ? В смысле компилятор проглатывает и ресурс собирается или на выполнение окейно отрабатывает и результаты правильные запрос выводит ?
опа.. а слона то я и не заметил ...
вообще ни хера не работает ... блин ... аффигеть ... вобщем вмето 30 строк сиквела ...придется 100500 випа теперь окчеврыжить ....
обманул ...одинарный case работает хоршо :) но это не радует.
Зарегал в ПИр
Время ведет!
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение 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
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Сообщение 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 ну ни как
Время ведет!
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

Ну тады тока ждать когда поправят данные моментик (
Ну или пойти по ..
http://forum.galaktika.by/viewtopic.php?t=153

Но тогда Вы скептически высказались по поводу такого извращенного способа )
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Сообщение Masygreen »

Den писал(а):Ну тады тока ждать когда поправят данные моментик (
Ну или пойти по ..
http://forum.galaktika.by/viewtopic.php?t=153

Но тогда Вы скептически высказались по поводу такого извращенного способа )
щас вдумался .. ваша идея мне понравилась попробую заменить двойное условие одинарными вложенными Case

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

case when datekatnotes>=? then
case when datekatnotes<=? then 1 else 0 end
else 0 end as col_date
интересно схавает или нет :)
Время ведет!
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Сообщение Masygreen »

итог .. да последний хитровыдуманный вариант сработал .. но попытка воткнуть еще один уровень временной таблицы уронил этот запрос .. :( вобщем если case еще можно обойти то дальнейшие вложенные запросы у бивают эту идею наповал :(
Время ведет!
Ответить