Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 12.10.2009, 15:31   #1
SlavaSH
Форумчанин
 
Регистрация: 12.08.2008
Сообщений: 174
По умолчанию Выборка данных из таблицы

В базе данных имеется две таблицы:

USLUGI
поля:
KEY_USLUGI Integer
NAME_USLUGI Varchar

KLIENT_UCHET
поля:
KEY_KLIENT_UCHET Integer
KEY_USLUGI Integer
KEY_KLIENT Integer
DATA Date
TYPE_UCHET Integer

Требуется выбрать из таблицы USLUGI только те наименования, для которых в таблице KLIENT_UCHET последнее значение (максимальная дата) TYPE_UCHET было 0 или 2, определенное значение KEY_KLIENT и до определенной даты.

Если сделать запрос:

Код:
SELECT KEY_USLUGI, NAME_USLUGI FROM USLUGI
where KEY_USLUGI in (select KEY_USLUGI FROM KLIENT_UCHET where ((TYPE_UCHET = 0) or (TYPE_UCHET = 2)) and (DATA <= :DATA) and (KEY_KLIENT = :KEY_KLIENT))
Order by NAME_USLUGI
то отбираются те данные, для которых в таблице KLIENT_UCHET значение TYPE_UCHET было 0 или 2, определенное значение KEY_KLIENT и до определенной даты, но это значение не было последним.

А если использовать запрос:

Код:
SELECT KEY_USLUGI, NAME_USLUGI FROM USLUGI
where KEY_USLUGI in (select KEY_USLUGI FROM KLIENT_UCHET where ((TYPE_UCHET = 0) or (TYPE_UCHET = 2)) and (MAX(DATA) <= :DATA) and (KEY_KLIENT = :KEY_KLIENT) group by KEY_USLUGI, TYPE_UCHET, KEY_KLIENT)
Order by NAME_USLUGI
то возникает ошибка:

Код:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Cannot use an aggregate function in a WHERE clause, use HAVING instead.
Не знаю как еще объяснить... надеюсь будет понятно
SlavaSH вне форума
Старый 12.10.2009, 16:04   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

какая субд?
soleil@mmc вне форума
Старый 12.10.2009, 16:13   #3
SlavaSH
Форумчанин
 
Регистрация: 12.08.2008
Сообщений: 174
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
какая субд?
firebird__________
SlavaSH вне форума
Старый 12.10.2009, 16:18   #4
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

попробуйте group by KEY_USLUGI
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума
Старый 12.10.2009, 16:26   #5
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

вот такой запрос получается
(если какие-то траблы с внутренним запросом, то его можно вынести куда-нить во вьюху)
к параметрам следует обращаться по имени
Код:
select 
  u.key_uslugi,
  max(u.name_uslugi) name_uslugi
from
  uslugi u,
  klient_uchet ku2
where 0=0
   and u.key_uslugi = ku2.key_uslugi
   and ku2.type_uchet in (0, 2)
   and ku2.key_klient = :p0
   and (ku2.key_uslugi, ku2.data) in (
                             select 
                                ku.key_uslugi,
                                max(ku.data)
                             from klient_uchet ku
                             where 0=0
                                and ku.type_uchet in (0, 2)
                                and ku.key_klient = :p0
                               and ku.data < :p1 + 1
                             group by ku.key_uslugi)
group by u.key_uslugi
soleil@mmc вне форума
Старый 12.10.2009, 16:38   #6
SlavaSH
Форумчанин
 
Регистрация: 12.08.2008
Сообщений: 174
По умолчанию

Цитата:
Сообщение от Sparky Посмотреть сообщение
попробуйте group by KEY_USLUGI
я пробовал и так... ошибка та же

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
вот такой запрос получается
(если какие-то траблы с внутренним запросом, то его можно вынести куда-нить во вьюху)
к параметрам следует обращаться по имени
Код:
select 
  u.key_uslugi,
  max(u.name_uslugi) name_uslugi
from
  uslugi u,
  klient_uchet ku2
where 0=0
   and u.key_uslugi = ku2.key_uslugi
   and ku2.type_uchet in (0, 2)
   and ku2.key_klient = :p0
   and (ku2.key_uslugi, ku2.data) in (
                             select 
                                ku.key_uslugi,
                                max(ku.data)
                             from klient_uchet ku
                             where 0=0
                                and ku.type_uchet in (0, 2)
                                and ku.key_klient = :p0
                               and ku.data < :p1 + 1
                             group by ku.key_uslugi)
group by u.key_uslugi
Вот такая ошибка:
Код:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 11, column 23.
,.
Что-то не нравится запятая в строке:
Код:
  and (ku2.key_uslugi, ku2.data) in (
и еще вопрос.... а что дает where 0=0 ?

Последний раз редактировалось Stilet; 13.10.2009 в 13:34.
SlavaSH вне форума
Старый 12.10.2009, 16:53   #7
SlavaSH
Форумчанин
 
Регистрация: 12.08.2008
Сообщений: 174
По умолчанию

Прилагаю файл базы данных на всякий случай
Вложения
Тип файла: rar Base.rar (40.2 Кб, 14 просмотров)
SlavaSH вне форума
Старый 13.10.2009, 13:27   #8
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

я пронал тестовый набор под ораклом - все работает

Код:
with 
  uslugi as( 
  select 1 key_uslugi, 'услуга 1' name_uslugi from dual union all
  select 2, 'услуга 2' from dual union all
  select 3, 'услуга 3' from dual union all
  select 4, 'услуга 4' from dual union all
  select 5, 'услуга 5' from dual
  ),
  
  klient_uchet as (
  select 10 key_klient_uchet, 1 key_uslugi, 1021 key_klient, to_date('01.09.2009', 'DD.MM.YYYY') data, 0 type_uchet from dual union all
  select 20, 1, 1021, to_date('03.09.2009', 'DD.MM.YYYY'), 2 from dual union all
  select 30, 2, 1021, to_date('05.09.2009', 'DD.MM.YYYY'), 3 from dual union all
  select 40, 2, 1021, to_date('01.09.2009', 'DD.MM.YYYY'), 4 from dual union all
  select 50, 3, 1021, to_date('03.09.2009', 'DD.MM.YYYY'), 5 from dual union all
  select 60, 3, 1021, to_date('06.09.2009', 'DD.MM.YYYY'), 2 from dual union all
  select 70, 4, 1021, to_date('07.09.2009', 'DD.MM.YYYY'), 0 from dual union all
  select 80, 4, 1021, to_date('09.09.2009', 'DD.MM.YYYY'), 2 from dual union all
  select 90, 5, 1021, to_date('30.09.2009', 'DD.MM.YYYY'), 0 from dual union all
  select 100, 5, 1021, to_date('23.09.2009', 'DD.MM.YYYY'), 1 from dual union all
  select 110, 4, 1021, to_date('13.09.2009', 'DD.MM.YYYY'), 3 from dual union all
  select 120, 3, 1021, to_date('05.09.2009', 'DD.MM.YYYY'), 2 from dual
  )

select 
  u.key_uslugi,
  max(u.name_uslugi) name_uslugi
from
  uslugi u,
  klient_uchet ku2
where 0=0
   and u.key_uslugi = ku2.key_uslugi
   and ku2.type_uchet in (0, 2)
   and ku2.key_klient = :p0
   and (ku2.key_uslugi, ku2.data) in (
                             select 
                                ku.key_uslugi,
                                max(ku.data)
                             from klient_uchet ku
                             where 0=0
                                and ku.type_uchet in (0, 2)
                                and ku.key_klient = :p0
                               and ku.data < :p1 + 1
                             group by ku.key_uslugi
                             )
group by u.key_uslugi
order by 2
при параметрах p0 = 1021, p1 = 01.10.2009
вернулся набор данных
1 услуга 1
3 услуга 3
4 услуга 4
5 услуга 5

если ФБ (кстати, какая версия ФБ?) не понимает такого обычного для СКЛ обращения к 2м полям в условии фильтрации, то пробуйте, как я и писал ранее, создать вьюху/селективную_ХП для внутреннего запроса
soleil@mmc вне форума
Старый 13.10.2009, 14:03   #9
SlavaSH
Форумчанин
 
Регистрация: 12.08.2008
Сообщений: 174
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
если ФБ (кстати, какая версия ФБ?) не понимает такого обычного для СКЛ обращения к 2м полям в условии фильтрации, то пробуйте, как я и писал ранее, создать вьюху/селективную_ХП для внутреннего запроса
Версия ФБ 2.0... да не понимает (не знаю почему)

А как создать эту вьюху не подскажите?
SlavaSH вне форума
Старый 13.10.2009, 14:10   #10
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

в вашем случае лучше создавать селективную_ХП

Код:
set term ^ ;

create procedure sel$key_uslugi_by_date
(pKey_klient integer,
 pData date)
returns
(key_uslugi integer,
 data date)
as
begin
  for 
    select 
      ku.key_uslugi,
      max(ku.data)
    from klient_uchet ku
    where 0=0
       and ku.type_uchet in (0, 2)
       and ku.key_klient = :pKey_klient
       and ku.data < :pData + 1
    group by ku.key_uslugi
  into :key_uslugi,
        :data 
  do begin
    suspend;
  end;
end
^

set term ; ^
и далее ваш запрос переделать в нечто такое

Код:
select 
  u.key_uslugi,
  max(u.name_uslugi) name_uslugi
from
  uslugi u,
  sel$key_uslugi_by_date(:p0, :p1) s
where 0=0
   and u.key_uslugi = s.key_uslugi
group by u.key_uslugi
или такое
Код:
select 
  u.key_uslugi,
  max(u.name_uslugi) name_uslugi
from uslugi u  
where 0=0
   and u.key_uslugi in (select s.key_uslugi from sel$key_uslugi_by_date(:p0, :p1) s)
group by u.key_uslugi

Последний раз редактировалось soleil@mmc; 13.10.2009 в 14:15.
soleil@mmc вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выборка данных из таблицы и составление отчета! WildKosha Microsoft Office Excel 20 25.02.2013 16:11
Выборка из таблицы Kenny Spark Microsoft Office Excel 4 16.07.2009 15:15
выборка из таблицы Screame Microsoft Office Excel 2 12.07.2009 19:55
ADO, выборка из таблицы. Roof БД в Delphi 2 09.07.2008 18:51
Выборка из таблицы ivp88 БД в Delphi 5 12.01.2008 14:36